#3 #9 #13 WA,貌似是输出了0
查看原帖
#3 #9 #13 WA,貌似是输出了0
793142
anmengxun楼主2023/9/17 11:59
#include <iostream>
#include <cstdio>
#include <set>
#include <vector>
#include <stack>
#include <cmath>
using namespace std;
#define MX 50005
//图的基本信息 
int n,m;
struct Node{
	int dfn,low,gro;
	int val,chudu;
};
Node point[MX];
vector <int> edge[MX];//原图 
Node newpoint[MX];
vector <int> newedge[MX];//缩点后的新图 

//tarjan
int dfn0,gro0;
stack <int> sta;
void divide_into_group()
{
	int temp = sta.top();
	sta.pop();
	point[temp].gro = gro0;
	newpoint[gro0].val++;
}
void tarjan(int now)
{
	point[now].dfn = point[now].low = ++dfn0;
	sta.push(now);
	for (int nxt : edge[now])
	{
		if (point[nxt].dfn == 0)
		{
			tarjan(nxt);
			point[now].low = min(point[nxt].low,point[now].low);
		}
		else
		{
			if (point[nxt].gro == 0)
			{
				point[now].low = min(point[nxt].dfn,point[now].low);
			}
		}
	}
	if (point[now].dfn == point[now].low)
	{
		gro0++;
		while (sta.top() != now)
		{
			divide_into_group();
		}
		divide_into_group();
	}
}

//缩点建新图 
void suodian()
{
	for (int i = 1;i <= n;i++)
	{
		for (int to : edge[i])
		{
			if (point[to].gro != point[i].gro)
			{
				newedge[point[i].gro].push_back(point[to].gro);
				newpoint[point[i].gro].chudu++;
			}
		}
	}
}

//读入 
void read()
{
	scanf("%d %d",&n,&m);
	for (int i = 1;i <= m;i++)
	{
		int u,v;
		scanf("%d %d",&u,&v);
		edge[u].push_back(v);
	}
}

//输出 
int ans = 0;
void say()
{
	for (int i = 1;i <= gro0;i++)
	{
		if (newpoint[i].chudu == 0)
		{
			if (ans != 0)
			{
				ans = 0;
				return;
			}
			else
			{
				ans = newpoint[i].val;
			}
		}
	}
	printf("%d",ans);
}

int main()
{
	read();
	for (int i = 1;i <= n;i++)
	{
		if (point[i].gro == 0)
		{
			tarjan(i);
		}
	}
	suodian();
	say();
	return 0;
}

求助

2023/9/17 11:59
加载中...