#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); } }
POJ 1144 割点
猜你喜欢
转载自www.cnblogs.com/stranger-/p/10050988.html
今日推荐
周排行