#include<bits/stdc++.h>
using namespace std;
const int N=2e5;
int n,m;
int sum,ans[N+5];
int dfn[N+5],low[N+5],dfncnt = 0;
int cnt,head[N+5],nxt[N+5],to[N+5];
void add(int u,int v)
{
cnt++;
nxt[cnt]=head[u];
to[cnt]=v;
head[u]=cnt;
}
void tarjan(int id,int father)
{
int son=0;
dfncnt++;
dfn[id]=low[id]=dfncnt;
for(int i=head[id];i;i=nxt[i])
{
if(to[i]==father)
continue;
if(dfn[to[i]]==0)
{
son++;
tarjan(to[i],id);
low[id]=min(low[id],low[to[i]]);
if(id!=father && low[to[i]]>=dfn[id])
ans[id]=true;
}
else if(dfn[to[i]]<dfn[id])
low[id]=min(dfn[to[i]],low[id]);
if(id==father && son>=2)
ans[id]=true;
}
return ;
}
main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
add(u,v),add(v,u);
}
for(int i=1;i<=n;i++)
if(dfn[i]==0)
tarjan(i,i);
for(int i=1;i<=n;i++)
if(ans[i]==true)
sum++;
cout<<sum<<"\n";
for(int i=1;i<=n;i++)
if(ans[i]==true)
cout<<i<<" ";
return 0;
}
这是一个tarjan求割点的代码,想要问一下你谷的大佬们。
如果有一个环,为什么不会死循环呢?