食物链
食物链
题目描述
如图所示为某生态系统的食物网示意图,据图回答第一小题。

- 数一数,在这个食物网中最长的食物链包含的物种数是 ( )
......
现在给你 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 个捕食关系。
(数据保证输入数据符号合生物学特点,且不会有重复的能量流动关系出现)
输出描述
一个整数即食物网中的最长的食物链包含的生物数。
样例输入
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
样例输出
6
样例解释
输入的图就是上面题目描述的那个图.
各个物种的编号依次为:
草 <->1 兔 <->2 狐 <->3 鼠 <->4 猫头鹰 <->5 吃虫的鸟 <->6 蜘蛛 <->7 蛇 <->8 青蛙 <->9 食草昆虫 <->10。
最长的食物链为:1->10->7->6->8->5。
思考
拓扑排序问题,下次一定。
感谢我的好舍友tsz给的参考,比网上的题解简单1W倍,领先N年。网上的代码实在是太啰嗦了。
怎么理解,下次一定。
代码
点击查看代码
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 1001;
int n, m, ans, cnt; // ans答案,cnt存储到达结点之后已经路过的结点数量
int g[N][N] = {0};
int in[N] = {0};
int out[N] = {0};
void dfs(int x);
int main()
{
int s, e;
while (cin >> n >> m)
{
ans = cnt = 0;
memset(in, 0, sizeof in);
memset(out, 0, sizeof out);
memset(g, 0, sizeof g);
for (int i = 1; i <= m; i++)
{
cin >> s >> e;
g[s][e] = 1;
out[s]++; //出度+1
in[e]++; //入度+1
}
//寻找入度为0的点
for (int i = 0, k = 0; i < n; i++)
if (in[i] == 0)
dfs(i);
ans++;
cout << ans << endl;
}
return 0;
}
void dfs(int x)
{
for (int i = 1; i <= n; i++)
{
if (g[x][i] == 0)
ans = max(ans, cnt);
else
{
cnt++;
dfs(i);
cnt--;
}
}
}

浙公网安备 33010602011771号