C++求最长的一条食物链的长度。DFS深度优先算法
题目描述
如图所示为某生态系统的食物网示意图,据图回答第一小题。
1. 数一数,在这个食物网中最长的食物链包含的物种数是 ( )
......
现在给你 n 个物种和 m 条能量流动关系,求其中的食物链条数。
物种的名称为从 1 到 n 编号,m 条能量流动关系形如
a1 b1
a2 b2
a3 b3
……
am−1 bm−1
am bm
其中 ai bi 表示能量从物种 ai 流向物种 bi,即 ai 和 bi 之间存在捕食关系,且 ai 是被捕食者, bi 是捕食者。一条食物链是从顶到底的,即从能量流向的起点到终点。如图中的草->兔->狐就是一条食物链,而草->兔则不是。
一条食物链至少包含两种生物。
输入描述
多组输入,每组第一行两个正整数 n 和 m。0 < n, m <= 1000
接下来 m 行每行两个整数 ai bi 表示 m 个捕食关系。
(数据保证输入数据符号合生物学特点,且不会有重复的能量流动关系出现)
输出描述
一个整数即食物网中的最长的食物链包含的生物数。
样例输入
Copy to Clipboard
10 16
1 2
1 4
1 10
2 3
2 5
4 3
4 5
4 8
6 8
7 6
7 9
8 5
9 8
10 6
10 7
10 9
样例输出
Copy to Clipboard
6
样例解释
输入的图就是上面题目描述的那个图。
各个物种的编号依次为:
草 <->1 兔 <->2 狐 <->3 鼠 <->4 猫头鹰 <->5 吃虫的鸟 <->6 蜘蛛 <->7 蛇 <->8 青蛙 <->9 食草昆虫 <->10。
最长的食物链为:1->10->7->6->8->5。
思路:把食物链当作森林,创一个根结点,连结入度为零的几个节点形成一棵树,直接DFS一次即可。最后输出长度减一(新建的那个要减掉)
#include<iostream> #include<vector> #include<cstring> using namespace std; const int maxn=100000; int a[maxn]; int m,n,x,y; vector<int>t[1000]; int md=1; int in[maxn],out[maxn]; void dfs( int x, int depth) { if(depth>md) { md=depth; } for(int i=0;i<t[x].size();i++) { dfs(t[x][i],depth+1); } } int main() { while(cin>>n>>m){ for(int i=0;i<m;i++) { cin>>x>>y; t[x].push_back(y); out[x]=1; in[y]=1; } for(int i=1;i<=n;i++) { if(in[i]==0) t[0].push_back(i); } dfs(0,1); cout<<md-1<<endl; md=1; memset(in, 0, sizeof(in)); memset(out, 0, sizeof(out)); for(int i = 0;i<1000;i++) t[i].clear(); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本