POJ 1144 割點
阿新 • • 發佈:2018-12-01
#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); } }