您的位置:首页 > 其它

POJ 1523 SPF 割点

2013-03-05 20:15 309 查看
View Code 1 #include<stdio.h>
2 #include<string.h>
3
4 #define N 1010
5 #define M N*N
6
7 int low
,dfn
,sub
,index;
8 int tail
,eNum;
9 struct Edge
{
int e,next;
}edge[M];

int Min(int x,int y)
{
if(x>y)return y;
return x;
}
int Max(int x,int y)
{
if(x>y)return x;
return y;
}
void Add(int x,int y)
{
edge[eNum].e=y;
edge[eNum].next=tail[x];
tail[x]=eNum++;

edge[eNum].e=x;
edge[eNum].next=tail[y];
tail[y]=eNum++;
}
void Build()
{
eNum=1;index=0;
memset(tail,-1,sizeof(tail));
memset(dfn,-1,sizeof(tail));
for(int i=1;i<=N;i++)
sub[i]=1;
sub[1]=0;
}
void Tarjan(int u)
{
int v;
dfn[u]=low[u]=++index;
for(int i=tail[u];i!=-1;i=edge[i].next)
{
v=edge[i].e;
if(dfn[v]==-1)
{
Tarjan(v);
low[u]=Min(low[u],low[v]);
if(dfn[u]<=low[v])
sub[u]++;
}
else low[u]=Min(low[u],dfn[v]);
}
}
int main()
{
int x,y,n,cas=1;
while(scanf("%d",&x),x)
{
int flag=0;n=0;
Build();
scanf("%d",&y);
Add(x,y);
n=Max(n,Max(x,y));
while(1)
{
scanf("%d",&x);
if(x==0)break;
scanf("%d",&y);
Add(x,y);
n=Max(n,Max(x,y));
}
Tarjan(1);
printf("Network #%d\n",cas++);
for(int i=1;i<=n;i++)
{
if(sub[i]>1)
{
flag=1;
printf(" SPF node %d leaves %d subnets\n",i,sub[i]);
}
}
if(flag==0)
printf(" No SPF nodes\n");
printf("\n");
}
return 0;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: