求割点
#include<iostream>
#include<map>
#include<algorithm>
#include<stack>
#include<vector>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;
vector<int>g[1005];
stack<int>st;
int dfn[1005],low[1005],spf[1005],indx;
bool vis[1005];
void tarjan(int i)
{
int j;
low[i]=dfn[i]=++indx;
vis[i]=true;
for(j=0;j<g[i].size();j++)
{
int v=g[i][j];
if(!vis[v])
{
tarjan(v);
if(dfn[i]<=low[v])
{
spf[i]++;
}
else
{
low[i]=min(low[v],low[i]);
}
}
else
{
low[i]=min(low[i],dfn[v]);
}
}
}
int main()
{
int i,x,y;
int t=1;
while(scanf("%d",&x)&&x)
{
indx=0;
for(i=0;i<1005;i++)
{
g[i].clear();
spf[i]=0;
vis[i]=false;
}
scanf("%d",&y);
g[x].push_back(y);
g[y].push_back(x);
while(scanf("%d",&x)&&x)
{
scanf("%d",&y);
g[x].push_back(y);
g[y].push_back(x);
}
int flag=0;
tarjan(1);
spf[1]--;
printf("Network #%d\n",t++);
for(i=1;i<1005;i++)
{
if(spf[i]>0)
{
printf(" SPF node %d leaves %d subnets\n",i,spf[i]+1);
flag=1;
}
}
if(!flag)
printf(" No SPF nodes\n");
printf("\n");
}
return 0;
}