A - Network POJ - 1144(割点)

链接:https://cn.vjudge.net/contest/258373#problem/A

代码:

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;

char m[1000];
vector<int>g[105];
int low[105],dfn[105],vis[105],top;

void tarj(int fa,int u)
{
    low[u]=dfn[u]=++top;//时间戳
    int child=0;//子树的个数
    int oo=g[u].size();
    for(int i=0;i<oo;i++)
    {
        int v=g[u][i];
        if(!dfn[v])
        {
            ++child;
            tarj(u,v);
            low[u]=min(low[u],low[v]);//和前面的时间戳比较
            if(u!=1&&low[v]>=dfn[u]) vis[u]=1;//if不等于根节点,而且他的子图遍历不到时间戳比他小的,为割点
        }
        else
        {
            low[u]=min(low[u],dfn[v]);//
        }
    }
    if(fa<0&&child>1) vis[u]=1;//if为根节点且子树有大于一个那么根节点为割点
}

int main()
{
    int a;
    int x,y;
    while(~scanf("%d",&a)&&a)
    {
        for(int i=1;i<=a;i++) g[i].clear();
        while(~scanf("%d",&x)&&x)
        {
            while(~scanf("%d",&y))
            {
                g[x].push_back(y);
                g[y].push_back(x);
                if(getchar()=='\n') break;
            }
        }
        memset(low,0,sizeof(low));
        memset(dfn,0,sizeof(dfn));
        memset(vis,0,sizeof(vis));
        int pp=0;
        top=0;
        tarj(-1,1);
        for(int i=1;i<=a;i++) if(vis[i]) pp++;
        printf("%d\n",pp);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/The_city_of_the__sky/article/details/85306262