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;
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;
相关文章推荐
- POJ 1523 SPF
- Zoj 1119 POJ 1523 SPF 求关节点及删除关节点会出现多少个连通分量 Tarjan算法
- POJ - 1523 SPF
- POJ 1523、ZOJ 1119 SPF - from lanshui_Yang
- POJ 1523 SPF
- POJ 1523 SPF
- POJ 1523 SPF (割点 && 点双连通分量)
- POJ 1523 SPF【求割点】
- poj 1523 SPF 输出割点及割点分割的点集数目
- POJ1523 SPF
- [割点问题]poj_1523_SPF
- Poj 1523 SPF(割点 + tarjan算法)
- POJ 1523 SPF(割点,分块,tarjan)
- POJ 1523 SPF [解题报告]
- POJ 1523 SPF 割点 Tarjan
- POJ1523-SPF
- POJ 1523 SPF
- poj 1523 SPF 求割点
- POJ 1523 SPF (割顶 点双连通分量)
- [割点] poj 1523 SPF