求图中割点的个数
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int N=109;
int low[N],dfn[N],id,ans,n;
bool vis[N];
vector<int> g[N];
void dfs(int u)
{
low[u]=dfn[u]=++id;
int ch=0;//孩子数目
for (int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if (!dfn[v])//确保子树不相连
{
dfs(v);
ch++;
if (low[v]>=dfn[u]&&u!=1) vis[u]=true;//标记是割点
low[u]=min(low[v],low[u]);
}else low[u]=min(low[u],dfn[v]);
}
if (u==1&&ch>=2) vis[1]=true;//如果是根节点,必须有两个以上不相连的子树才行
}
int main()
{
while (scanf("%d",&n)!=-1)
{
if (n==0)break;
memset(low,0,sizeof(low));
memset(dfn,0,sizeof(dfn));
id=0;
for (int i=0;i<=n;i++) g[i].clear();
int a,b;
while (scanf("%d",&a)&&a)
while (getchar()!='\n')
{
scanf("%d",&b);
g[a].push_back(b);
g[b].push_back(a);
}
memset(vis,false,sizeof(vis));
ans=0;
dfs(1);
for (int i=1;i<=n;i++) ans+=vis[i];
printf("%d\n",ans);
}
}