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;
}
C++求最长的一条食物链的长度。DFS深度优先算法的更多相关文章
- 求最长连续公共子序列 POJ 3080
Description The Genographic Project is a research partnership between IBM and The National Geographi ...
- hdu 1595 find the longest of the shortest【最短路枚举删边求删除每条边后的最短路,并从这些最短路中找出最长的那条】
find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others) Memory Limit: 32768/32768 ...
- HDU 1025 Constructing Roads In JGShining's Kingdom(求最长上升子序列nlogn算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025 解题报告:先把输入按照r从小到大的顺序排个序,然后就转化成了求p的最长上升子序列问题了,当然按p ...
- HDU 4612 Warm up tarjan缩环+求最长链
Warm up Problem Description N planets are connected by M bidirectional channels that allow instant ...
- 训练赛 Grouping(强连通分量缩点 + DAG求最长路)
http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=158#problem/F 大致题意:给出n个人和m种关系(ti,si),表示ti ...
- 【HDOJ1217】【Floyd求最长路】
http://acm.hdu.edu.cn/showproblem.php?pid=1217 Arbitrage Time Limit: 2000/1000 MS (Java/Others) M ...
- 计蒜之道 初赛 第三场 题解 Manacher o(n)求最长公共回文串 线段树
腾讯手机地图 腾讯手机地图的定位功能用到了用户手机的多种信号,这当中有的信号的作用范围近.有的信号作用的范围则远一些.有的信号相对于用户在不同的方位强度是不同的,有的则是在不论什么一个方向上信号强度都 ...
- 求最长回文子串,O(n)复杂度
最长回文子串问题-Manacher算法 最长回文串问题是一个经典的算法题. 0. 问题定义 最长回文子串问题:给定一个字符串,求它的最长回文子串长度. 假设一个字符串正着读和反着读是一样的,那它就是回 ...
- HDU 1243 反恐训练营 (动态规划求最长公共子序列)
反恐训练营 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- UVA 10029 Edit Step Ladders ——(DAG求最长路)
题意:升序的给出一本若干个单词,每个单词都可删除一个字母,添加一个字母或者改变一个字母,如果任意一个操作以后能变成另外一个字典中的单词,那么就连一条有向边,求最长的长度. 分析:DAG的最长路和最短路 ...
随机推荐
- H5 ios端底部安全距离CSS
html 头部添加 <meta name="viewport" content="width=device-width, initial-scale=1.0,min ...
- Linux运维基础(二)网络常见问题
问题:网卡地址配置不正确 1.网卡地址和虚拟主机的网卡地址不统一 2.网关和DNS的信息不正确 解决方法:如何重新配置网卡地址信息 步骤一:在命令行中使用"nmtui"命令,回车 ...
- SaltStack 远程命令执行中文乱码问题
问题 我在一台服务器上写了一个简单的 Python 脚本 haha.py,内容如下: [root@localhost ~]# cat haha.py print("你好") 当我在 ...
- 7.9K star!跨平台开发从未如此简单,这个开源框架让APP开发效率飙升!
嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 Lynx 是一个革命性的跨平台开发框架,使用 TypeScript 开发即可同时构建 iOS ...
- 代码随想录第十天 | Leecode 232. 用栈实现队列、Leecode 225. 用队列实现栈、 Leecode 20. 有效的括号、Leecode 1047. 删除字符串中的所有相邻重复项
Leecode 232. 用栈实现队列 题目链接:https://leetcode.cn/problems/implement-queue-using-stacks/submissions/ 题目描述 ...
- 高性能深度学习推理引擎 -- OpenPPL
OpenPPL OpenPPL是商汤基于自研高性能算字库的开源深度学习推理平台,能够让人工智能应用高效可靠地运行在现有的CPU/GPU等计算平台上,为云端场景提供人工智能推理服务 OpenPPL基于全 ...
- codeup之C语言10.10
Description 给定字符串定义char *a = "I love China!",读入整数n,输出在进行了a = a + n这个赋值操作以后字符指针a对应的字符串. Inp ...
- codeup之奖金计算
codeup c2奖金计算 Description 某企业发放的奖金根据利润提成.利润I低于或等于100000时,奖金可提10%:利润高于100000元,低于200000元(100000<I&l ...
- 数据类型转换(java)
默认转换(从小到大 /*联想式理解:从弱变强 因为代码的世界是正能量的,所以可以默许蜕变得原来越好哇*/) byte(1),short(2),char -> int(4) -> long( ...
- Java 删除目录下相同文件
摘要:通过MD5算法对指定目录下的文件去重. 背景 之前写了一篇博客<Java判断两个文件是否相同>,介绍如何校验两个文件内容是否相同,但是,不适用于对目录下文件去重的场景,故对其进行 ...