2016年2月22日 星期一

[Uva 315][articulation point] Network

原題連結
完全不解釋,就是一題裸的割點......
而且N才出到100,這題大概是在考你怎麼讀一行的數字吧......

#include<bits/stdc++.h>
using namespace std;
const int maxn=100+5;
vector<int> G[maxn];
int iscut[maxn],pre[maxn],dfs_clock;
int dfs(int now,int fa)
{
    int lownow=pre[now]=++dfs_clock;
    int child=0;
    for(int i=0;i<G[now].size();i++)
    {
        int to=G[now][i];
        if(!pre[to])
        {
            child++;
            int lowto=dfs(to,now);
            lownow=min(lownow,lowto);
            if(lowto>=pre[now]) iscut[now]=1;
        }
        else if(pre[to]<pre[now] && to!=fa) lownow=min(lownow,pre[to]);
    }
    if(fa<0 && child<=1) iscut[now]=0;
    return lownow;
}
int main()
{
    int N;
    while(scanf("%d",&N)==1 && N)
    {
        for(int i=1;i<=N;i++) G[i].clear();
        int a,b;
        while(scanf("%d",&a) && a)
        {
            char c;
            c=getchar();
            for(;c!='\n';)
            {
                b=0;
                for(;;)
                {
                    c=getchar();
                    if(c==' ' || c=='\n') {G[b].push_back(a);G[a].push_back(b);break;}
                    b=b*10+c-'0';
                }
            }
        }
        dfs_clock=0;
        memset(pre,0,sizeof pre);
        memset(iscut,0,sizeof iscut);
        for(int i=1;i<=N;i++) if(!pre[i]) dfs(i,-1);
        int ans=0;
        for(int i=1;i<=N;i++) if(iscut[i]) ans++;
        printf("%d\n",ans);
    }
}

沒有留言:

張貼留言