int dfn[MAXN],low[MAXN],cnt,root; bool iscut[MAXN]; void tarjan(int x) { dfn[x]=low[x]=++cnt; int flag=0; for(int i=f(x);i;i=n(i)) if(!dfn[v(i)]) { tarjan(v(i)),low[x]=min(low[x],low[v(i)]); if(low[v(i)]>=dfn[x]) { flag++; if(x!=root || flag>1)iscut[x]=1; } } else low[x]=min(low[x],dfn[v(i)]); } for(int i=1;i<=n;i++) if(!dfn[i]){root=i;tarjan(i);}
开始好像抄了个错的板子……
原文:https://www.cnblogs.com/Al-Ca/p/11180937.html