关于tarjan
  • 板块学术版
  • 楼主letianJOE
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/10/3 19:53
  • 上次更新2024/10/3 21:33:51
查看原帖
关于tarjan
658497
letianJOE楼主2024/10/3 19:53
#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求割点的代码,想要问一下你谷的大佬们。

如果有一个环,为什么不会死循环呢?

2024/10/3 19:53
加载中...