模板 Tarjan割点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板 Tarjan割点相关的知识,希望对你有一定的参考价值。

题目描述

给出一个n个点,m条边的无向图,求图的割点。

输入输出格式

输入格式:

第一行输入n,m

下面m行每行输入x,y表示x到y有一条边

输出格式:

第一行输出割点个数

第二行按照节点编号从小到大输出节点,用空格隔开

输入输出样例

输入样例#1:

6 7
1 2
1 3
1 4
2 5
3 5
4 5
5 6

输出样例#1:

1 
5

说明

n,m均为100000

tarjan 图不一定联通!!!

 

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #define int long long
 4 using namespace std;
 5 const int MAXN=200010;
 6 struct XY{int to,pre;}e[MAXN*2];
 7 int las[MAXN],dfn[MAXN],low[MAXN],res[MAXN];
 8 int tim=0,sz=1,ans=0,n,m,x,y;
 9 
10 void add(int a,int b){
11     e[++sz].to=b;e[sz].pre=las[a];las[a]=sz;
12     e[++sz].to=a;e[sz].pre=las[b];las[b]=sz;
13 }
14 
15 void tarjan(int u,int fa){
16     int son=0,v;
17     dfn[u]=low[u]=++tim;
18     for (int i=las[u];i;i=e[i].pre)
19     if (!dfn[v=e[i].to]){
20         son++;tarjan(v,u);
21         low[u]=min(low[u],low[v]);
22         if (dfn[u]<=low[v]&&!res[u]) ans++,res[u]=1;
23     }else if (v!=fa) low[u]=min(low[u],dfn[v]);
24     if (fa==-1&&son==1) res[u]=0,ans--;
25 }
26 
27 main(){
28     cin >>n>>m;
29     for (int i=1;i<=m;++i) scanf("%lld%lld",&x,&y),add(x,y);
30     for (int i=1;i<=n;++i) if (!dfn[i]) tarjan(i,-1);
31     cout <<ans<<endl;
32     for (int i=1;i<=n;++i) if (res[i]) printf("%lld ",i);
33     return 0;
34 }

 

以上是关于模板 Tarjan割点的主要内容,如果未能解决你的问题,请参考以下文章

模板 Tarjan割点

[模板] tarjan求割点

模板割点(割顶)(洛谷_3388)——tarjan

Tarjan 割点割边模板

tarjan缩点与割点

Tarjan求强连通分量求桥和割点模板