#include <iostream>
#include <cstdio>
#include <memory.h>
#include <cstring>
#include <cstdlib>
using namespace std;
const int maxn=100;
struct edge{
int v,next;
}es[maxn*5];
int dfn[maxn],low[maxn],head[maxn],idx,i,n,ans;
char buf[maxn];
void init(){
idx=0;
ans=0;
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
for(int i=1;i<=n;++i){
head[i]=-1;
}
}
void addEdge(int u,int v,int eidx){
es[eidx].v=v;
es[eidx].next=head[u];
head[u]=eidx;
}
void tarjan(int u,bool root){
dfn[u]=low[u]=++idx;
int cnt=0;
for(int ne=head[u];ne!=-1;ne=es[ne].next){
int v=es[ne].v;
if(!dfn[v]){
tarjan(v,false);
low[u]=min(low[u],low[v]);
if(root){//根节点特判
cnt++;
}
else if(low[v]>=dfn[u]){
cnt++;
}
}else{
low[u]=min(low[u],dfn[v]);
}
}
if((root&&cnt>1)||(!root&&cnt)){
ans++;
}
}
int main(){
while(scanf("%d\n",&n)&&n){
init();
int eidx=0;
while(gets(buf)&&strcmp(buf,"0")){
int u,v;
char *pstr=strtok(buf," ");
u=atoi(pstr);
while(pstr){
pstr=strtok(NULL," ");
if(!pstr)break;
v=atoi(pstr);
addEdge(u,v,eidx++);
addEdge(v,u,eidx++);
}
}
tarjan(1,true);
printf("%d\n",ans);
}
}
ZOJ 1311 Network(tarjan求割点)
最新推荐文章于 2022-08-27 17:05:40 发布