这个题是个模板题吧,就是求割点的个数,直接代码吧。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAX 2001
using namespace std;
int n,e,t,root,pnt[MAX],head[MAX],nxt[MAX],vis[MAX],cut[MAX],dfn[MAX],low[MAX];
void add(int u,int v)
{
pnt[e]=v,nxt[e]=head[u],head[u]=e++;
}
void dfs(int u,int fa)
{
int v,cnt=0,flag=1;
vis[u]=1;
dfn[u]=low[u]=++t;
for(int i=head[u];i!=-1;i=nxt[i])
{
v=pnt[i];
if(v==fa&&flag)
{
flag=0;
continue;
}
if(!vis[v])
{
dfs(v,u);
cnt++;
low[u]=min(low[u],low[v]);
if((u==root&&cnt>1)||(u!=root&&low[v]>=dfn[u]))
cut[u]=1;
}
else if(vis[v]==1)
low[u]=min(low[u],dfn[v]);
}
vis[u]=2;
}
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
t=e=0;
root=1;
memset(head,-1,sizeof(head));
memset(low,0,sizeof(low));
memset(dfn,0,sizeof(dfn));
memset(vis,0,sizeof(vis));
memset(cut,0,sizeof(cut));
int m;
while(scanf("%d",&m)&&m)
{
while(getchar()!='\n')
{
int ita;
scanf("%d",&ita);
add(m,ita);
add(ita,m);
}
}
dfs(1,-1);
int ans=0;
for(int i=1;i<=n;i++)
if(cut[i])
ans++;
printf("%d\n",ans);
}
return 0;
}