Network UVA - 315(求割点)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;
const int maxn = 10010, INF = 0x7fffffff;
int pre[maxn], low[maxn], iscut[maxn];
vector<int> G[maxn];
int dfs_clock, n;

int dfs(int u, int fa)
{
    int lowu = pre[u] = ++dfs_clock;
    int child = 0;
    for(int i=0; i<G[u].size(); i++)
    {
        int v = G[u][i];
        if(!pre[v])
        {
            child++;
            int lowv = dfs(v, u);
            lowu = min(lowv, lowu);
            if(lowv >= pre[u])
                iscut[u] = 1;
        }
        else if(pre[v] < pre[u] && v != fa)
            lowu = min(lowu, pre[v]);
    }
    if(fa < 0 && child == 1) iscut[u] = 0;
    low[u] = lowu;
    return lowu;
}

void init()
{
    for(int i=1; i<=n; i++) G[i].clear();
    dfs_clock = 0;
    mem(pre, 0);
    mem(iscut, 0);
    mem(low, 0);
}


int main()
{
    int a, b;
    char ch;
    while(cin>> n && n)
    {
        int ret = 0;
        init();
        while(scanf("%d",&a) && a)
        {
            while(scanf("%d%c", &b, &ch))
            {
                G[a].push_back(b);
                G[b].push_back(a);
                if(ch == '\n') break;
            }
        }
        dfs(1,-1);
        for(int i=1; i<=n; i++)
            if(iscut[i]) ret++;
        cout<< ret <<endl;

    }


    return 0;
}

猜你喜欢

转载自www.cnblogs.com/WTSRUVF/p/9300030.html
今日推荐