社区讨论

52分求调

P2341[USACO03FALL / HAOI2006] 受欢迎的牛 G参与者 2已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mhjnt6lz
此快照首次捕获于
2025/11/04 05:35
4 个月前
此快照最后确认于
2025/11/04 05:35
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 4e5 + 10;
int n,m;
vector<int> a[maxn];
vector<int> b[maxn];
int low[maxn],cnt,sta[maxn],top,num,h[maxn],chu[maxn],dfn[maxn];
bool vis[maxn];
void tarjan(int u)
{
	dfn[u] = low[u] = ++num;
	sta[++top] = u;
	vis[u] = 1;
	for(int v : a[u])
	{
		if(dfn[v] == 0)
		{
			tarjan(v);
			low[u] = min(low[u],low[v]);
		}
		else if(vis[v])
		{
			low[u] = min(low[u],dfn[v]);
		}
	}
	if(low[u] == dfn[u])
	{
		cnt++;
		while(sta[top] != u)
		{
			b[cnt].push_back(sta[top]);
			vis[sta[top]] = 0;
			h[sta[top]] = cnt;
			top--;
		}
		b[cnt].push_back(sta[top]);
		vis[sta[top]] = 0;
		h[sta[top]] = cnt;
		top--;
	}
}
signed 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;
		a[u].push_back(v);
	}
	for(int i = 1;i <= n;i++)
	{
		if(!dfn[i])
			tarjan(i);
	}
	for(int i = 1;i <= n;i++)
	{
		for(int j = 0;j < a[i].size();j++)
		{
			if(h[i] != h[a[i][j]])
			{
				chu[h[i]]++;
			}
		}
	}
	int id = -1;
	for(int i = 1;i <= cnt;i++)
	{
		if(chu[i] == 0)
		{
			if(id != -1)
			{
				cout << "0";
				return 0;
			} 
		}
		id = i;
	}
	cout << 1;
	return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...