标签:技术 blog lines ring follow number rip plm width
Time Limit: 1000MS | Memory Limit: 10000K | |
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<cstdio> #include<cstring> #include<algorithm> #define N 1001 using namespace std; int tot=1,front[N],to[N*N*2],nxt[N*N*2]; int dfn[N],low[N],id; bool cutpoint[N],part[N]; void add(int u,int v) { to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; } void tarjan(int u,int pre) { dfn[u]=low[u]=++id; int sum=0; bool tmp=false; for(int i=front[u];i;i=nxt[i]) { if(i==(pre^1)) continue; if(!dfn[to[i]]) { sum++; tarjan(to[i],i); low[u]=min(low[u],low[to[i]]); if(low[to[i]]>=dfn[u]) tmp=true; } else low[u]=min(low[u],dfn[to[i]]); } if(!pre) { if(sum>1) cutpoint[u]=true; } else if(tmp) cutpoint[u]=true; } void solve() { tarjan(1,0); bool ok=false; int sum; for(int i=1;i<N;i++) if(cutpoint[i]) { ok=true; sum=0; memset(part,0,sizeof(part)); for(int j=front[i];j;j=nxt[j]) if(!part[low[to[j]]]) { part[low[to[j]]]=true; sum++; } printf(" SPF node %d leaves %d subnets\n",i,sum); } if(!ok) printf(" No SPF nodes\n"); puts(""); } void clear() { tot=1; id=0; memset(front,0,sizeof(front)); memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(cutpoint,0,sizeof(cutpoint)); } int main() { //freopen("1.txt","w",stdout); int u,v,t=0,last; while(scanf("%d",&u)!=EOF) { if(u) { scanf("%d",&v); add(u,v); } else { if(!last) return 0; t++; printf("Network #%d\n",t); solve(); clear(); } last=u; } }
标签:技术 blog lines ring follow number rip plm width
原文地址:http://www.cnblogs.com/TheRoadToTheGold/p/6920459.html