求割点
#include<iostream>#include<map>#include<algorithm>#include<stack>#include<vector>#include<string>#include<cstring>#include<cstdio>using namespace std;vector<int>g[1005];stack<int>st;int dfn[1005],low[1005],spf[1005],indx;bool vis[1005];void tarjan(int i)
{ int j; low[i]=dfn[i]=++indx; vis[i]=true; for(j=0;j<g[i].size();j++) { int v=g[i][j]; if(!vis[v]) { tarjan(v); if(dfn[i]<=low[v]) { spf[i]++; } else { low[i]=min(low[v],low[i]); } } else { low[i]=min(low[i],dfn[v]); } }} int main(){ int i,x,y; int t=1; while(scanf("%d",&x)&&x) { indx=0; for(i=0;i<1005;i++) { g[i].clear(); spf[i]=0; vis[i]=false; } scanf("%d",&y); g[x].push_back(y); g[y].push_back(x); while(scanf("%d",&x)&&x) { scanf("%d",&y); g[x].push_back(y); g[y].push_back(x); } int flag=0; tarjan(1); spf[1]--; printf("Network #%d\n",t++); for(i=1;i<1005;i++) { if(spf[i]>0) { printf(" SPF node %d leaves %d subnets\n",i,spf[i]+1); flag=1; } } if(!flag) printf(" No SPF nodes\n"); printf("\n");}
return 0;
}