tarjan全WA求助
查看原帖
tarjan全WA求助
658995
Spring_qwq楼主2023/9/13 21:15

rt,悬赏一关注

#include<bits/stdc++.h>
#define ri register int
#define ll long long
#pragma G++ optimize(3)
using namespace std;
int t=0,dfn[100010],low[100010],n,m,cnt=0,lt[100010];
vector<int>g[100010],ans[100010];
bool vis[100010],bj[100010];
stack<int>z;
void dfs(int x)
{
	dfn[x]=++t;
	low[x]=t;
	z.push(x);
	vis[x]=1;
	for(int i=0;i<g[x].size();i++)
	{
		if(!dfn[g[x][i]])
		{
			dfs(g[x][i]);
			low[x]=min(low[x],low[g[x][i]]);
		}
		else if(vis[g[x][i]])
		low[x]=min(low[x],dfn[g[x][i]]);
	}
	if(low[x]==dfn[x])
	{
		cnt++;
		while(1)
		{
			int y=z.top();
			ans[cnt].push_back(y);
			lt[y]=cnt;
			z.pop();
			vis[y]=0;
			if(y==x)break;
		}
		sort(ans[cnt].begin(),ans[cnt].end());
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		g[u].push_back(v);
	}
	for(int i=1;i<=n;i++)if(!dfn[i])dfs(i);
	for(int i=1;i<=n;i++)
	{
		if(bj[lt[i]])continue;
		bj[lt[i]]=1;
		for(int j=0;j<ans[lt[i]].size();j++)printf("%d ",ans[lt[i]][j]);
		printf("\n");
	}
	return 0;
}
2023/9/13 21:15
加载中...