思路:
- 记录每一条边输入时的出度和入度。
- 然后遍历每一个点的入度,将入度为零的点存入队列中,同时将入度为零的点相对应的f(食物链数量数组)置为1.
- 然后开始对队列进行BFS,同时更新所到点的食物链数量,最后当一个点的出入度都为0时,将它的食物链数量记录到ans中。
代码:
#include <iostream>
#include<algorithm>
#include<queue>
using namespace std;
int n,m;
int G[5005][5005];
int ru[5005],chu[5005];
int f[5005];
int MOD=80112002;
int ans=0;
queue<int> q;
int main() {
cin>>n>>m;
for(int i=0;i<m;i++){
int u,v;
cin>>u>>v;
G[u][v]=1;
ru[v]++;
chu[u]++;
}
for(int i=1;i<=n;i++)
{
if(ru[i]==0)
{
q.push(i);
f[i]=1;
}
}
while(!q.empty()){
int cur=q.front();
q.pop();
for(int i=1;i<=n;i++)
{
if(G[cur][i]==1)
{
f[i]+=f[cur];
f[i]%=MOD;
ru[i]--;
if(ru[i]==0)
{
if(chu[i]==0)
{
ans+=f[i];
ans%=MOD;
continue;
}
q.push(i);
}
}
}
}
cout<<ans<<endl;
}