最大食物链计数

题目链接:https://www.luogu.com.cn/problem/P4017

题意:

求有多少条最大食物链

思路:

记dp[i]是以第i种生物作为食物链末尾时,最大生物链的条数

所以通过拓补序,每次都转移,最后找到出度为0的点,累加dp即可

注意状态转移以及答案的累加都需要取模

#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define endl "\n"
#define int long long
#define fi first
#define se second
//#pragma GCC optimize(3)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef __int128 lll;
typedef pair<int,int> pii;
const int inf=0x3f3f3f3f;
const ll llmax=LLONG_MAX;
const int maxn=1e5+5;
const int mod=80112002;
queue<int>q;
void solve(){
	int n,m;
	cin>>n>>m;
	vector<int>dout(n+1,0);
	vector<int>din(n+1,0);
	vector<int>e[5005];
	rep(i,1,m){
		int u,v;cin>>u>>v;
		e[u].pb(v);
		din[v]++;
		dout[u]++;
	}
	vector<int>dp(n+1,0);
	for(int i=1;i<=n;i++){
		if(din[i]==0){
			q.push(i);
			dp[i]=1;
		}
	}
	while(!q.empty()){
		int x=q.front();q.pop();
		for(auto point:e[x]){
			dp[point]+=dp[x]%mod;
			if(--din[point]==0){
				q.push(point);
			}
		}
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		if(dout[i]==0){
			ans=(ans%mod+dp[i]%mod)%mod;
		}
	}
	cout<<ans%mod;
}

signed main()
{
	ios::sync_with_stdio(false),cin.tie(0);
	int T=1;
	
	while(T--){
	solve();
	}
	
	return 0;
}


posted @ 2025-03-04 18:59  Marinaco  阅读(38)  评论(0)    收藏  举报
//雪花飘落效果