有 N(≤10,000)頭牛,M(≤50,000)對有序關係 (A, B) 表示 A 認為 B 受歡迎。關係可傳遞。求被所有牛認為受歡迎的牛的數量。
A → B。#include <bits/stdc++.h>
using namespace std;
const int N = 10024;
struct Edge { int to, next; } e[N*10];
int head[N], e_cnt;
int dfn[N], low[N], stk[N], top, idx, scc_cnt;
int bel[N], scc_sz[N], out_deg[N];
bool in_stk[N];
void add_edge(int u, int v) {
e[e_cnt] = {v, head[u]}; head[u] = e_cnt++;
}
void tarjan(int u) {
dfn[u] = low[u] = ++idx;
stk[++top] = u; in_stk[u] = true;
for (int i = head[u]; ~i; i = e[i].next) {
int v = e[i].to;
if (!dfn[v]) { tarjan(v); low[u] = min(low[u], low[v]); }
else if (in_stk[v]) low[u] = min(low[u], dfn[v]);
}
if (dfn[u] == low[u]) {
++scc_cnt;
int v;
do {
v = stk[top--];
in_stk[v] = false;
bel[v] = scc_cnt;
++scc_sz[scc_cnt];
} while (v != u);
}
}
int main() {
ios::sync_with_stdio(false); cin.tie(0);
int n, m;
while (cin >> n >> m) {
fill(head, head+n+1, -1); e_cnt = 0;
fill(dfn, dfn+n+1, 0); fill(in_stk, in_stk+n+1, false);
fill(out_deg, out_deg+n+1, 0); fill(scc_sz, scc_sz+n+1, 0);
idx = top = scc_cnt = 0;
for (int i = 0; i < m; ++i) {
int a, b; cin >> a >> b;
add_edge(a, b);
}
for (int i = 1; i <= n; ++i) if (!dfn[i]) tarjan(i);
for (int u = 1; u <= n; ++u)
for (int i = head[u]; ~i; i = e[i].next) {
int v = e[i].to;
if (bel[u] != bel[v]) out_deg[bel[u]]++;
}
int zero_cnt = 0, ans_scc = 0;
for (int i = 1; i <= scc_cnt; ++i)
if (out_deg[i] == 0) { ++zero_cnt; ans_scc = i; }
cout << (zero_cnt == 1 ? scc_sz[ans_scc] : 0) << '\n';
}
return 0;
}