洛谷P4017 最大食物链计数 题解

本题做法

  • 拓扑排序。

思路

本题可以利用拓扑排序,每次找到入度为 0 的生物,然后将吃它的生物的路径计数加上它本身的计数,直到所有生物都被遍历到为止。最后输出答案即可。

代码

#include<bits/stdc++.h>

typedef long long ll;
typedef unsigned long long ull;

using namespace std;

const int N=5005;
const int M=5e5+5;
const ll P=80112002;

struct node{
    int in;
    int out;
    ll num;
    vector<int> to;
} a[N];

int n,m;

int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
        a[x].out++;
        a[y].in++;
        a[x].to.push_back(y);
    }
    queue<node> q;
    int query[N]={0},cnt=0;
    for(int i=1;i<=n;i++){
        if(a[i].in==0) {
            a[i].num=1;
            q.push(a[i]);
        }
        if(a[i].out==0) query[++cnt]=i;
    }
    while(!q.empty()){
        node cur=q.front();
        q.pop();
        for(int i=0;i<cur.out;i++){
            a[cur.to[i]].in--;
            a[cur.to[i]].num=(a[cur.to[i]].num+cur.num)%P;
            if(a[cur.to[i]].in==0){
                q.push(a[cur.to[i]]);
            }
        }
    }
    ll sum=0;
    for(int i=1;i<=cnt;i++){
        sum=(sum+a[query[i]].num)%P;
    }
    cout<<sum<<endl;
    return 0;
}
posted @ 2025-07-06 18:48  2789617221guo  阅读(64)  评论(0)    收藏  举报