POJ

嘛,输入有点恶心....

考虑输入完后....

直接就是割点裸题了....

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define MAXN 10005
using namespace std;.

int n,tot,dx;
int h[MAXN],low[MAXN],dfn[MAXN],cnt[MAXN],rt,ans;

struct node{
    int from,to,next;
}e[MAXN<<1];

void init(){
    tot=dx=ans=rt=0;
    memset(h,-1,sizeof(h));
    memset(low,0,sizeof(low));
    memset(dfn,0,sizeof(dfn));
    memset(cnt,0,sizeof(cnt));
}

void add(int x,int y){
    tot++;
    e[tot].from=x;
    e[tot].to=y;
    e[tot].next=h[x];
    h[x]=tot;
}

int tarjan(int now,int fa){
    dx++;
    low[now]=dfn[now]=dx;
    for(int i=h[now];i!=(-1);i=e[i].next){
        if(!dfn[e[i].to]){
            tarjan(e[i].to,now);
            low[now]=min(low[now],low[e[i].to]);
            if(now==1)rt++;
            else if(low[e[i].to]>=dfn[now])cnt[now]=1;
        }
        else if(e[i].to!=fa){
            low[now]=min(low[now],dfn[e[i].to]);
        }
    }
}

int main(){
    while(scanf("%d",&n)==1){
        if(n==0)break;
        init();
            int x,y;
        while(scanf("%d",&x)==1&&x){
            while(getchar()!='
'){
                cin>>y;
                add(x,y);
                add(y,x);
            }
        }
        tarjan(1,1);        
        for(int i=1;i<=n;i++){
            if(cnt[i]==1)ans++;
        }        
        if(rt>1)ans++;
        cout<<ans<<endl;
    }
}
View Code

码风丑请见谅....