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;
}
复制代码

 

posted @   Fordson  阅读(417)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示