题目:食物链
思路:
记忆化搜索。
就是找出所有入度为0的点到出度为0的点的所有路径。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 100000
#define maxm 200000
int n,m;
vector<int> g[maxn+5];
int indu[maxn+5],outdu[maxn+5];
int f[maxn+5]={0};
void readin(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
g[x].push_back(y);
indu[y]++,outdu[x]++;
}
}
int dfs(int x){
if(outdu[x]==0) return 1;
if(f[x]) return f[x];
for(int i=0;i<g[x].size();i++){
int y=g[x][i];
f[x]+=dfs(y);
}
return f[x];
}
int slv(){
int ans=0;
for(int i=1;i<=n;i++){
if(indu[i]==0&&outdu[i]!=0) {
ans+=dfs(i);
}
}
return ans;
}
int main(){
readin();
int ans=slv();
printf("%d",ans);
return 0;
}
本文介绍了一种解决食物链问题的有效算法——记忆化搜索。通过找出所有入度为0的点到出度为0的点的所有路径,该算法能够高效地计算食物链中的路径数量。代码使用C++实现,详细展示了如何进行深度优先搜索并存储中间结果以避免重复计算。
914

被折叠的 条评论
为什么被折叠?



