1. 程式人生 > >POJ 1144 割點

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); } }