题目
给出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;
}