割点
代码:
#include<iostream>
#include<fstream>
using namespace std;
int n;
struct e{
int data;
e *next;
};
e edge[101];
int v[101],dfn[101],low[101],index;
void solve(int s){
int i,j,k;
dfn[s]=low[s]=++index;
e *p=edge[s].next;
v[s]=0;
while(p)
{
if(dfn[p->data]==0)
{
solve(p->data);
if(low[p->data]>=dfn[s])
v[s]++;
low[s]=min(low[s],low[p->data]);
}
else
low[s]=min(low[s],dfn[p->data]);
p=p->next;
}
}
void read(){
// ifstream cin("in.txt");
int i,j,k;
char c[1000];
while(cin>>n){
if(n==0) return;
for(i=1;i<=n;i++)
edge[i].next=0;
getchar();
while(gets(c))
{
j=0;k=-1;
for(i=0;i<strlen(c);i++)
{
if(c[i]==' ')
{
if(k==-1){
k=j;
}
else
{
e *p=new e;
p->data=j;
p->next=edge[k].next;
edge[k].next=p;
e *q=new e;
q->data=k;
q->next=edge[j].next;
edge[j].next=q;
}
j=0;
}
else
{
j=j*10+c[i]-'0';
}
}
if(k!=-1)
{
e *p=new e;
p->data=j;
p->next=edge[k].next;
edge[k].next=p;
e *q=new e;
q->data=k;
q->next=edge[j].next;
edge[j].next=q;
}
else break;
}
index=0;
memset(dfn,0,sizeof(dfn));
solve(1);
if(v[1]<=1) v[1]=0;
j=0;
for(i=1;i<=n;i++)
if(v[i]>0) j++;
cout<<j<<endl;
}
}
int main(){
read();
return 0;
}