洛谷 P4017 最大食物链计数 (图论——拓扑排序)

在这里插入图片描述

思路:

  • 记录每一条边输入时的出度和入度。
  • 然后遍历每一个点的入度,将入度为零的点存入队列中,同时将入度为零的点相对应的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;
}

猜你喜欢

转载自blog.csdn.net/qq_43663263/article/details/108076977
今日推荐