POJ 1144 割点

#include<iostream>
#include<stdio.h>
#include<vector>
#include<string.h>
#include<stdlib.h>
using namespace std;
const int maxn = 1e5+10;
int dfn[maxn], low[maxn];
int cut[maxn];
int n,m,num,sol;
vector<int> g[maxn];
void init()
{
    memset(dfn,0,sizeof(dfn));
    memset(cut,0,sizeof(cut));
    for(int i=0;i<n;i++) g[i].clear();
    num=sol=0;
}
void tarjan(int u,int fa)
{
    int children = 0;
    dfn[u] = low[u] = ++num;
    for (int v: g[u])
    {
        if (!dfn[v])
        {
            children++;
            tarjan(v,u);
            low[u] = min(low[u], low[v]);
        //根节点有两个字树就是割点 其他点满足后者
if ((fa == -1 && children >= 2)||(fa != -1 && low[v] >= dfn[u])) cut[u]=1; } else if (v != fa) low[u] = min(low[u], dfn[v]); } } int main() { while(scanf("%d",&n)!=EOF&&n) { int x,y; init(); while(scanf("%d",&x)&&x) { while(getchar()!='\n') { scanf("%d",&y); g[x].push_back(y); g[y].push_back(x); } } tarjan(1,-1); for(int i=0;i<=n;i++) if(cut[i])sol++; printf("%d\n",sol); } }

猜你喜欢

转载自www.cnblogs.com/stranger-/p/10050988.html
今日推荐