如题,拓扑排序 + 邻接表。
#include "bits/stdc++.h"
using namespace std;
queue<int> q;
int ind[1919810], outd[1919810];
struct Edge {
int to, nxt;
}e[1919810];
int hd[1919810];
int cnt, N, M, ans;
int val[1919810];
void add_edge(int u, int v) {
++cnt;
e[cnt].to = v;
e[cnt].nxt = hd[u];
hd[u] = cnt;
}
void Topo() {
for (int i = 1; i <= N; ++i)
if (ind[i] == 0) {
val[i] = 1;
q.push(i);
}
while (!q.empty()) {
int u, v;
u = q.front();
q.pop();
for (int i = hd[u]; i; i = e[i].nxt) {
v = e[i].to;
val[v] = (val[v] + val[u]) % 80012002;
--ind[v];
if (ind[v] == 0) q.push(v);
}
}
}
int main() {
scanf ("%d%d", &N, &M);
for (int i = 1; i <= M; ++i) {
int u, v;
scanf ("%d%d", &u, &v);
add_edge(u, v);
++ind[v]; ++outd[u];
}
Topo();
for (int i = 1; i <= N; ++i)
if (outd[i] == 0) ans = (ans + val[i]) % 80112002;
cout << ans;
}