您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: