poj 1144

割点

代码:

#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;
}

posted on 2011-05-26 10:44  宇宙吾心  阅读(388)  评论(0编辑  收藏  举报

导航