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

转载于:https://www.cnblogs.com/zhaozhe/archive/2011/05/26/2057931.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值