分析
日敲模板……
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#include<iostream>
#define N 2000005
using namespace std;
int n;
int nxt[N],to[N],head[N],cnt=0;
int dfn[N],low[N],dfs=0,cut[N];
void add(int x,int y){
nxt[++cnt]=head[x];head[x]=cnt;to[cnt]=y;
nxt[++cnt]=head[y];head[y]=cnt;to[cnt]=x;
}
int root;
void tarjan(int u,int fu){
dfn[u]=low[u]=++dfs;
int flag=0;
for(int e=head[u];e;e=nxt[e]){
int v=to[e];
if(!dfn[v]){
tarjan(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u]){
flag++;
if(u!=root||flag>1) cut[u]=1;
}
}
else if(v!=fu) low[u]=min(low[u],dfn[v]);
}
}
int main()
{
while(1){
scanf("%d",&n);
if(!n) break;
int i,j,k,ans=0;
memset(head,0,sizeof(head));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(cut,0,sizeof(cut));
cnt=0;dfs=0;
while(1){
int rt;
scanf("%d",&rt);
if(!rt) break;
while(1){
scanf("%d",&i);
add(rt,i);
char c=getchar();
if(c=='\r') break;
}
}
for(i=1;i<=n;++i)
if(!dfn[i]) root=i,tarjan(i,0);
for(i=1;i<=n;++i)
if(cut[i]) ans++;
cout<<ans<<'\n';
}
return 0;
}