RT,抄的第一篇题解,去掉了关于 instack
的部分。
#include<bits/stdc++.h>
#define N 10050
using namespace std;
struct EDGE {
int nxt, to;
}edge[N * 20];
int head[20 * N], dfn[N], low[N];
int deg[N], id[N], all[N];
int cnt, tot, sccnt, n, m;
stack<int>s;
inline void add(int x, int y) {
cnt++;
edge[cnt].to = y;
edge[cnt].nxt = head[x];
head[x] = cnt;
}
void tarjan(int x) {
dfn[x] = low[x] = ++tot;
s.push(x);
for (int i = head[x]; i; i = edge[i].nxt) {
int u = edge[i].to;
if (!dfn[u]) {
tarjan(u);
low[x] = min(low[x], low[u]);
}
else low[x] = min(low[x], dfn[u]);
}
int k;
if (low[x] == dfn[x]) {
++sccnt;
do {
k = s.top(); s.pop();
id[k] = sccnt; all[sccnt]++;
} while (x != k);
}
}
int main() {
cin >> n >> m;
int a, b;
for (int i = 1; i <= m; i++) {
cin >> a >> b;
add(a, b);
}
for (int i = 1; i <= n; i++)
if (!dfn[i])tarjan(i);
for (int w = 1; w <= n; w++)
for (int i = head[w]; i; i = edge[i].nxt) {
int u = edge[i].to;
if (id[w] != id[u])
deg[id[w]]++;
}
int tt = 0;
for (int i = 1; i <= sccnt; i++)
if (!deg[i]) {
if (tt) { puts("0"); return 0; }
tt = i;
}
printf("%d\n", all[tt]);
return 0;
}
AC了