思路:
拓补排序,题目给出了一条食物链的定义,即从入度为0开始到出度为0结束,用f[]数组储存每个点的食物链个数。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod = 80112002;
int g[5010][5010];
int num[5010];
queue<int>q;
int out_degree[5010];
int in_degree[5010];
int f[5010];
int main()
{
int n,m;
cin>>n>>m;
while(m--)
{
int u,v;
cin>>u>>v;
g[u][v] = 1;
in_degree[v]++;
out_degree[u]++;
}
for(int i = 1; i <= n; i++)
{
if(in_degree[i] == 0)
{
f[i] = 1;
q.push(i);
}
}
ll ans = 0;
while(!q.empty())
{
int k = q.front();
q.pop();
for(int i = 1; i <= n; i++)
{
if(g[k][i] == 1)
{
in_degree[i]--;
f[i] += f[k];
f[i] %= mod;
if(in_degree[i] == 0)
{
q.push(i);
if(out_degree[i] == 0)
{
ans += f[i];
ans %= mod;
}
}
}
}
}
cout<<ans<<endl;
}