题目链接:http://poj.org/problem?id=1523
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1010;
int edge[N][N];
int n, son;
int subnet[N], dfn[N], low[N], tmpdfn;
bool vis[N];
void init()
{
tmpdfn = 1;
son = 0;
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(vis,0,sizeof(vis));
memset(subnet,0,sizeof(subnet));
low[1] = dfn[1] = 1;
vis[1] = true;
}
void dfs(int u)
{
for(int v = 1; v <= n; v++)
{
if( edge[u][v] )
{
if( !vis[v] )
{
vis[v] = true;
dfn[v] = low[v] = ++tmpdfn;
dfs( v );
low[u] = min( low[u], low[v] );
if( low[v] >= dfn[u] )
{
if( u != 1 ) subnet[u]++;
else son++;
}
}
else low[u] = min( low[u], dfn[v] );
}
}
}
int main()
{
int Case = 0;
while( 1 )
{
int u, v;
n = 0;
scanf("%d", &u);
if( u == 0 ) break;
memset(edge,0,sizeof(edge));
scanf("%d",&v);
if( u > n ) n = u;
if( v > n ) n = v;
edge[u][v] = edge[v][u] = 1;
while(1)
{
scanf("%d",&u);
if( u == 0 ) break;
scanf("%d",&v);
if(u > n) n = u;
if(v > n) n = v;
edge[u][v] = edge[v][u] = 1;
}
if( Case ) puts("");
printf("Network #%d\n", ++Case);
init();
dfs(1);
if( son > 1 ) subnet[1] = son-1;
bool find = false;
for(int i = 1; i <= n; i++)
{
if( subnet[i] )
{
find = true;
printf(" SPF node %d leaves %d subnets\n", i, subnet[i]+1);
}
}
if( !find ) printf(" No SPF nodes\n");
}
return 0;
}