食物链

食物链

题目描述

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

  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 个捕食关系。

(数据保证输入数据符号合生物学特点,且不会有重复的能量流动关系出现)

输出描述

一个整数即食物网中的最长的食物链包含的生物数。

样例输入

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--;
        }
    }
}
posted @ 2022-06-01 21:24  请去看诡秘之主  阅读(942)  评论(1)    收藏  举报