模板割点(割顶)(洛谷_3388)——tarjan
Posted Yzyet
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板割点(割顶)(洛谷_3388)——tarjan相关的知识,希望对你有一定的参考价值。
tarjan求割点,打了个模板题。
#include<iostream> #include<cstdio> #include<vector> using namespace std; inline int read(){ int t=1,num=0;char c=getchar(); while(c>\'9\'||c<\'0\'){if(c==\'-\')t=-1;c=getchar();} while(c>=\'0\'&&c<=\'9\'){num=num*10+c-\'0\';c=getchar();} return num*t; } #define min(a,b) a<b?a:b const int N=100010; vector<int> g[N]; int cut[N],dfn[N],low[N]; int n,m,t=0,cnt=0; void dfs(int x,int fa){ dfn[x]=low[x]=++t;int child=0; for(int i=0;i<g[x].size();i++){ int y=g[x][i];if(y==fa)continue; if(!dfn[y]){ dfs(y,x);child++; low[x]=min(low[x],low[y]); if(low[y]>=dfn[x])cut[x]=1; } else low[x]=min(low[x],dfn[y]); } if(fa==-1&&child<=1&&cut[x])cut[x]=0; } int main() { n=read();m=read(); for(int i=1;i<=m;i++){ int x=read(),y=read(); g[x].push_back(y); g[y].push_back(x); } for(int i=1;i<=n;i++) if(!dfn[i])dfs(i,-1); for(int i=1;i<=n;i++) if(cut[i])cnt++; printf("%d\\n",cnt); for(int i=1;i<=n;i++) if(cut[i])printf("%d ",i); return 0; }
本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。
以上是关于模板割点(割顶)(洛谷_3388)——tarjan的主要内容,如果未能解决你的问题,请参考以下文章