https://www.luogu.com.cn/problem/P4017
思路
图为有向无环图,由于需要统计的是最大的食物链,也就是最低端为生产者,入度为0,最右端的消费者出度为0,我们可以这样,在拓扑排序的过程中,统计到各个点的方法数,也就是假如这个点就是顶端,有多少条,这个很简单,随着拓扑排序的进行逐步递推即可,到当前点的方案数为它上一级各方案数之和。故将每一个入度为0的点放到队列中,且方案数初始化为1,其他点为0,走一遍拓扑排序即可。
代码
#include <cstdio>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int N = 5005;
const int MOD = 80112002;
int n, m;
vector <int> g[N];
queue <int > q;
int chu[N], ru[N];
int sum[N], ans;
int main() {
cin >> n >> m;
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
chu[a]++, ru[b]++;
g[a].push_back(b);
}
for (int i = 1; i <= n; i++)
if (!ru[i]) {
sum[i] = 1;
q.push(i);
}
while (!q.empty()) {
int fro = q.front();
q.pop();
for (int i = 0; i < g[fro].size(); i++) {
int nex = g[fro][i];
sum[nex] = (sum[nex] + sum[fro]) % MOD;
ru[nex]--;
if (!ru[nex]) {
if (!chu[nex]) {
ans = (ans + sum[nex]) % MOD;
continue;
}
q.push(nex);
}
}
}
// for (int i = 1; i <= n; i++) cout << chu[i] << " ";
// cout << endl;
cout << ans << endl;
return 0;
}