题解
2026-09-27 16:40:19
发布于:浙江
2阅读
0回复
0点赞
dp拓扑排序。
#include <bits/stdc++.h>
using namespace std;
const int N = 5e3 + 5,MOD = 80112002;
int n,indeg[N],m,outdeg[N];
vector <int> g[N];
queue <int> q;
int dp[N]; //dp[i]:以i号动物为顶级消费者时的食物链最大数量。
void top_sort()
{
queue <int> q;
for(int i = 1;i <= n;i ++)
{
if(outdeg[i] == 0) // i号生物为最底层的生产者
{
q.push(i);
dp[i] = 1;
}
}
while(!q.empty())
{
int u = q.front();
q.pop();
for(auto& v : g[u])
{
dp[v] += dp[u];//v吃u,则u提供方案数
dp[v] %= MOD;
if(--outdeg[v] == 0)
{
q.push(v);
}
}
}
}
int main()
{
cin >> n >> m;
for(int i = 1;i <= m;i ++)
{
int a,b;
cin >> a >> b;
g[a].push_back(b);
indeg[a] ++;
outdeg[b] ++;
}
top_sort();
long long sum = 0;
for(int i = 1;i <= n;i ++)
{
if(indeg[i] == 0) sum = (sum + dp[i]) % MOD;
}
cout << sum;
return 0;
}
这里空空如也







有帮助,赞一个