POJ 1523 割点

来源:互联网 发布:莫言作品 知乎 编辑:程序博客网 时间:2024/05/01 17:03

//翻译见图论书390页

 

#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>using namespace std;#define MIN(a,b) ((a)<(b)?(a):(b))int mp1[1005];int mp2[1005];int g[1005][1005];int n;int low[1005];int visit[1005];int cnt;struct solve{int a;int b;};bool cmp(solve s1,solve s2){return mp2[s1.a]<mp2[s2.a];}solve s[1000];int solcnt;void dfs(int v){int res=0;low[v]=visit[v]=cnt++;for(int i=1;i<=n;i++){if(g[v][i]){if(visit[i]==0){dfs(i);if(low[i]>=visit[v]){res++;}else{low[v]=MIN(low[i],low[v]);}}else{low[v]=MIN(low[v],visit[i]);}}}if(res>0){s[solcnt].a=v;s[solcnt].b=res+1;solcnt++;}}void spf(){cnt=1;memset(visit,0,sizeof(visit));visit[1]=low[1]=cnt++;int r=0;for(int i=2;i<=n;i++){if(g[1][i]&&visit[i]==0){r++;dfs(i);}}if(r>1){s[solcnt].a=1;s[solcnt].b=r;solcnt++;}sort(s,s+solcnt,cmp);}int main(){int a,b=0;memset(g,0,sizeof(g));int cse=1;while(scanf("%d",&a)){if(a==0){if(b==0){break;}else{solcnt=0;spf();b=0;n=0;memset(g,0,sizeof(g));printf("Network #%d\n",cse++);if(solcnt==0){printf("  No SPF nodes\n");}for(int i=0;i<solcnt;i++){printf("  SPF node %d leaves %d subnets\n",mp2[s[i].a],s[i].b);}printf("\n");memset(mp1,0,sizeof(mp2));memset(mp2,0,sizeof(mp2));continue;}}scanf("%d",&b);if(mp1[a]==0){mp1[a]=++n;mp2[n]=a;}if(mp1[b]==0){mp1[b]=++n;mp2[n]=b;}g[mp1[a]][mp1[b]]=g[mp1[b]][mp1[a]]=1;}return 0;}