标签:images accept limit rom cstring string strong connect fine
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 9317 | Accepted: 4218 |
Description
Input
Output
Sample Input
1 2 5 4 3 1 3 2 3 4 3 5 0 1 2 2 3 3 4 4 5 5 1 0 1 2 2 3 3 4 4 6 6 3 2 5 5 1 0 0
Sample Output
Network #1 SPF node 3 leaves 2 subnets Network #2 No SPF nodes Network #3 SPF node 2 leaves 2 subnets SPF node 3 leaves 2 subnets
Source
#include<iostream> #include<cstdio> #include<queue> #include<algorithm> #include<cstring> #include<string> using namespace std; typedef long long LL; #define MAXN 1009 #define N 100 /* 求割点的个数 和割点被去掉之后联通快的个数 //删除割点u产生的连通数目为:u所在的连通分量数目+与u所连接的割边的数目+1(边:fa->u) */ struct edge { //edge(int _t,int _next):to(_t),next(_next){} int to, next; }; edge E[MAXN * MAXN]; int index, dfn[MAXN], low[MAXN], s[MAXN], head[MAXN], cnt, Max, cas = 1, root; bool flag; void Init() { index = 0; Max = -1; cnt = 0; flag = false; memset(head, -1, sizeof(head)); memset(dfn, 0, sizeof(dfn)); memset(s, 0, sizeof(s)); memset(low, 0, sizeof(low)); } void add_edge(int u, int v) { E[cnt].to = v; E[cnt].next = head[u]; head[u] = cnt++; Max = max(max(u, v), Max); } void tarjan(int pre, int u) { int son = 0; low[u] = dfn[u] = ++index; for (int i = head[u]; i != -1; i = E[i].next) { int v = E[i].to; if (!dfn[v]) { tarjan(u, v); son++; low[u] = min(low[v], low[u]); if ((u == root&&son > 1) || (u != root&&low[v] >= dfn[u])) { flag = true; s[u]++; } } else if (v != pre) low[u] = min(low[u], dfn[v]); } } int main() { int f, t; while (1) { Init(); while (scanf("%d",&f), f) { scanf("%d", &t); add_edge(f, t); add_edge(t, f); } if (Max == -1) break; root = Max; tarjan(-1, Max); printf("Network #%d\n",cas++); if (!flag) { printf(" No SPF nodes\n"); } else { for (int i = 1; i <= Max; i++) if (s[i] > 0) printf(" SPF node %d leaves %d subnets\n", i, s[i] + 1); } printf("\n"); } }
标签:images accept limit rom cstring string strong connect fine
原文地址:http://www.cnblogs.com/joeylee97/p/7307119.html