POJ 1523 割点
2012-07-28 10:44
183 查看
//翻译见图论书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 =a; } if(mp1[b]==0) { mp1[b]=++n; mp2 =b; } g[mp1[a]][mp1[b]]=g[mp1[b]][mp1[a]]=1; } return 0; }
相关文章推荐
- POJ1523-SPF
- POJ1523 SPF(割点模板)
- POJ 1523 SPF
- POJ-1523 SPF 无向图求割点
- POJ 1523 Tarjan求割点
- POJ 1523 无向图割点
- POJ 1523 SPF
- POJ 1523 SPF(无向图割顶)
- POJ1523 SPF (无向图求割点)
- POJ 1523 SPF
- 无向图的割顶(poj1523,1144)
- poj 1523 SPF 无向图求割点
- POJ 1523 割点
- POJ 1523 SPF 无向图求割点
- TOJ 2018 POJ 1523 SPF / 割点
- poj 1523 SPF
- poj 1523 SPF (无向图 求割项)
- 【连通图|关节点】POJ-1523 SPF
- POJ 1523 网络连通
- POJ 1523 SPF tarjan求割点