44分 求调,想不出哪里不对
查看原帖
44分 求调,想不出哪里不对
1158009
hjh_bit楼主2024/9/3 21:35

#include<bits/stdc++.h>
using namespace std; 
#define int long long
const int N = 100100;
struct eage
{
	int nt, to;
}e[N];
int head[N], id = 0; 
void add(int a, int b)
{
	e[++id].to = b;
	e[id].nt = head[a];
	head[a] = id;
}
int dfn[N], low[N], c[N], res[N], cnt = 0, du[N];
int now = 0;
bool vis[N];
stack<int> st;
void tarjan(int u)
{
	dfn[u] = low[u] = ++now;
	st.push(u); vis[u] = true;
	for (int i = head[u]; i; i = e[i].nt)
	{
		int v = e[i].to;
		if (!dfn[v])
		{
			tarjan(v);
			low[u] = min(low[u], low[v]);
		}
		else if (vis[v])
		{
			low[u] = min(low[u], dfn[v]);
		}
	}
	int k = 0;
	if (low[u] == dfn[u])
	{
		++cnt;
		do
		{
			k = st.top(); st.pop();
			vis[k] = false;
			c[k] = cnt; res[k]++;// c 将连通分量标为一样, res记录标为k的连通分量的个数
		} while (k != u);
	}
}
signed main()
{
	int n, m; scanf("%lld%lld", &n, &m);
	int a, b;
	for (int i = 1; i <= m; i++)
	{
		scanf("%lld%lld", &a, &b);
		add(a, b);
	}
	for (int i = 1; i <= n; i++)
	{
		if (!dfn[i])tarjan(i);
	}
	for (int i = 1; i <= n; i++)
	{
		for (int j = head[i]; j; j = e[j].nt)
		{
			if (c[i] != c[j])
			{
				du[c[i]]++;// 记录每个连通分量的度数;
			}
		}
	}
	int tmp = 0;
	for (int i = 1; i <= cnt; i++)
	{
		if (!du[i])
		{
			if (tmp) { puts("0"); return 0; }
			tmp = i;
		}
	}
	printf("%lld\n", res[tmp]);
	return 0;
}
2024/9/3 21:35
加载中...