模版题~~
//一个顶点u是割点,当且仅当满足(1)或(2)
//(1) u为树根,且u至少有两个子树。
//(2) u不为树根,且满足存在(u,v)为树枝边(或称父子边,即u为v在搜索树中的父亲),使得DFS(u)<=Low(v)。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=1007;
vector<int> a[maxn];
bool cut[maxn];
bool vis[maxn];
bool map[maxn][maxn];
int bfn[maxn],low[maxn];
int root,n;
void bfs(int u,int d)
{
bfn[u]=low[u]=d;
vis[u]=true;
int i,v;
for(i=0;i<a[u].size();i++)
{
v=a[u][i];
if(!vis[v])
{
bfs(v,d+1);
low[u]=min(low[u],low[v]);
if(u!=1&&low[v]>=bfn[u])
{
cut[u]=true;
}
else if(u==1)
{
root++;
}
}
else
{
low[u]=min(low[u],bfn[v]);
}
}
}
int main()
{
while(~scanf("%d",&n),n)
{
int u,v,i;
for(i=0;i<maxn;i++)
{
a[i].clear();
}
memset(cut,0,sizeof(cut));
while(scanf("%d",&u),u)
{
while(getchar()!='\n')
{
scanf("%d",&v);
a[v].push_back(u);
a[u].push_back(v);
}
}
root=0;
memset(vis,0,sizeof(vis));
bfs(1,1);
if(root>1)
{
cut[1]=true;
}
int sum=0;
for(i=1;i<=n;i++)
{
if(cut[i])
{
sum++;
}
}
printf("%d\n",sum);
}
return 0;
}