首页 > 其他 > 详细

POJ - 1144 输入方式+割点

时间:2020-02-18 22:34:36      阅读:49      评论:0      收藏:0      [点我收藏+]

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

考虑输入完后....

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

技术分享图片
#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()!=\n){
                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

码风丑请见谅....

POJ - 1144 输入方式+割点

原文:https://www.cnblogs.com/shatianming/p/12329006.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!