【模板】割点(割顶)
割点模板
1 #include<cstdio> 2 #include<algorithm> 3 #define N (1000000+10) 4 using namespace std; 5 int a[N],nxt[N],head[N],dfn[N],low[N],cnt,k; 6 bool cut[N],bst[N]; 7 void add(int x,int y){ 8 a[++k]=y; nxt[k]=head[x]; head[x]=k; 9 } 10 void tarjan(int u,int mr){ 11 int rc=0; 12 dfn[u]=low[u]=++cnt; 13 for (int p=head[u];p;p=nxt[p]){ 14 int v=a[p]; 15 if (!dfn[v]){ 16 tarjan(v,mr); 17 low[u]=min(low[u],low[v]); 18 if (low[v]>=dfn[u]&&u!=mr) cut[u]=true; 19 if (u==mr) rc++; 20 } 21 low[u]=min(low[u],dfn[v]); 22 } 23 if (u==mr&&rc>=2) cut[mr]=true; 24 } 25 int main(){ 26 int n,m,ans=0; 27 scanf("%d%d",&n,&m); 28 for (int i=1;i<=m;i++){ 29 int x,y; 30 scanf("%d%d",&x,&y); 31 add(x,y); 32 add(y,x); 33 } 34 for (int i=1;i<=n;i++){ 35 if (!dfn[i]) tarjan(i,i); 36 } 37 //for (int i=1;i<=n;i++) printf("%d %d %d\n",i,dfn[i],low[i]); 38 for (int i=1;i<=n;i++) if (cut[i]) ans++; 39 printf("%d\n",ans); 40 for (int i=1;i<=n;i++) if (cut[i]) printf("%d ",i); 41 }