poj 1523 SPF 输出割点及割点分割的点集数目

注意,初始化时当期时间戳就设为1在这里没错,但在poj1144就会错

所以我改了改,初始化时就设为0了

求割点的思想图论书上介绍的很详细了,推荐北京大学出版社出版的《图论算法理论、实现及其应用》

View Code
#include<stdio.h>
#include<string.h>
#define bug() {puts("bugbug");}
const int M = 1010;
int dfn[M],low[M];
int head[1010];
struct node{
int v;
int next;
}edge[100];
int subnet[M];
int vis[M];
int nodes,son;
int tdfn;
int tot=0;
int min(int a,int b)
{
return a<b?a:b;
}
void dfs(int u)
{
int i,v;low[u]=dfn[u]=++tdfn;
for(i=head[u];i!=-1;i=edge[i].next)
{
v=edge[i].v;
if(!dfn[v])
{
dfs(v);//to get low[v];
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u])
{
if(u!=1) subnet[u]++;
if(u==1) son++;
}
}
low[u]=min(dfn[v],low[u]);
}
}
void init()
{
int i;
nodes=0;son=0;tdfn=0;
for(i=1;i<=1000;i++)
subnet[i]=1;
memset(head,-1,sizeof(head));
memset(dfn,0,sizeof(dfn));
}
void add(int u,int v)
{
edge[tot].v=v;
edge[tot].next=head[u];
head[u]=tot++;
}
int main()
{
int i;
int u,v,flag;
int cases=1;
while(scanf("%d",&u),u)
{
init();
scanf("%d",&v);
if(u>nodes) nodes=u;
if(v>nodes) nodes=v;
add(u,v);
add(v,u);
while(scanf("%d",&u),u)
{
scanf("%d",&v);
if(u>nodes) nodes=u;
if(v>nodes) nodes=v;
add(u,v);
add(v,u);
}
if(cases>1) printf("\n");
printf("Network #%d\n",cases++);
dfs(1);//printf("fdsf");
if(son>1) subnet[1]=son;
flag=0;
for(i=1;i<=nodes;i++)
{
if(subnet[i]>1)
{
flag=1;
printf(" SPF node %d leaves %d subnets\n",i,subnet[i]);
}
}
if(!flag)
printf(" No SPF nodes\n");
}
return 0;
}



你可能感兴趣的:(poj)