P4017 最大食物链计数(DAG 上 DP)

常用拓扑排序进行转移。
这里记录 \(dp_i\) 表示以 \(i\) 为结尾的“半截食物链”条数。

#include<bits/stdc++.h>
using namespace std;
const int N=5009,Mod=80112002;
vector<int> k[N]; int In[N],dp[N],Out[N];
queue<int> q;
int main(){
    int n,m,l,r,ans=0; scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++) scanf("%d%d",&l,&r),k[l].push_back(r),In[r]++,Out[l]++;
    for(int i=1;i<=n;i++) if(In[i]==0) q.push(i),dp[i]=1;
    while(!q.empty()){
        l=q.front(),q.pop();
        for(int i:k[l]){
        	dp[i]=(dp[i]+dp[l])%Mod;
        	if(--In[i]==0) q.push(i);
		}
    }
    for(int i=1;i<=n;i++) if(Out[i]==0) ans=(ans+dp[i])%Mod;
    printf("%d\n",ans);
    return 0;
}
posted @ 2026-02-22 21:54  2025ing  阅读(0)  评论(0)    收藏  举报