最大食物链计数(记忆化搜索)

文章介绍了如何使用深度优先搜索(DFS)算法来计算一个生态系统中完整的食物链数量。在给定生物间的捕食关系后,通过记忆化优化避免重复计算,从而解决可能导致超时(TLE)的问题。代码示例展示了具体的DFS实现过程。
摘要由CSDN通过智能技术生成

题目

 给出m组某种生物A被某种生物B捕食的关系,求有多少条完整的食物链。

思路

因为要确定完整的食物链需要一直走到底,这很酷,很符合我对dfs的想象,因此我们只要标记出做生产者的生物,从这些生物开始往下搜。对于dfs,从当前生物开始到不会被其他生物捕食的消费者的食物链的数量,就可以转化成所有能够捕食当前生物的生物,从他们开始到不会被其他生物捕食的消费者的食物链的数量的和。终止条件自然就是当前的点就是食物链的末端,此时的食物链的数量当然就是1。当然,这样暴搜会产生很多的重复运算导致tle,再加上记忆化即可。

代码

#include <iostream>
using namespace std;
const int mod = 80112002;
int later[5005][5005],size1[5005],start[5005],dp[5005];
int dfs(int now){
	if(later[now][0]==0){
		dp[now]=1;
		return dp[now];
	}
	if(dp[now]!=0)return dp[now];
	for(int i=0;i<size1[now];i++){
		dp[now]=(dp[now]+dfs(later[now][i]))%mod;
	}
	return dp[now];
}
int main(){
	int n,m,ans=0;
	cin>>n>>m;
	while(m--){
		int l,r;
		cin>>l>>r;
		start[r]=1;
		later[l][size1[l]]=r;
		size1[l]+=1;
	}
	for(int i=1;i<=n;i++){
		if(start[i]==0){
			ans=(ans+dfs(i))%mod;
		}
	}
	cout<<ans;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值