拓扑排序例题 P4017 最大食物链计数

这篇具有很好参考价值的文章主要介绍了拓扑排序例题 P4017 最大食物链计数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

拓扑排序例题 P4017 最大食物链计数

题目链接:P4017 最大食物链计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

最大食物链计数

题目背景

你知道食物链吗?Delia 生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条。于是她来就来求助你,然而你也不会啊!写一个程序来帮帮她吧。

题目描述

给你一个食物网,你要求出这个食物网中最大食物链的数量。

(这里的“最大食物链”,指的是生物学意义上的食物链,即最左端是不会捕食其他生物的生产者,最右端是不会被其他生物捕食的消费者。)

Delia 非常急,所以你只有 1 1 1 秒的时间。

由于这个结果可能过大,你只需要输出总数模上 80112002 80112002 80112002 的结果。

输入格式

第一行,两个正整数 n 、 m n、m nm,表示生物种类 n n n 和吃与被吃的关系数 m m m

接下来 m m m 行,每行两个正整数,表示被吃的生物A和吃A的生物B。

输出格式

一行一个整数,为最大食物链数量模上 80112002 80112002 80112002 的结果。

样例 #1

样例输入 #1

5 7
1 2
1 3
2 3
3 5
2 5
4 5
3 4

样例输出 #1

5

提示

各测试点满足以下约定:

拓扑排序例题 P4017 最大食物链计数

【补充说明】

数据中不会出现环,满足生物学的要求。(感谢 @AKEE )文章来源地址https://www.toymoban.com/news/detail-424844.html

AC代码

#include<bits/stdc++.h>
#define IO std::ios::sync_with_stdio(false); \
std::cin.tie(0);                             \
std::cout.tie(0)

#define all(v) v.begin(),v.end()

#define int long long
#define PII pair<ll,int>
#define ld long double
#define x first
#define y second
#define endl '\n'
#define inf 0x3f3f3f3f
using namespace std;
const int N = 2e5+10;
int in[N],out[N];
int ans = 0;
queue<int> q;//拓扑排序队列
int num[N];//记录边长
vector<int> nei[N];//每个点分别邻接的点

//出度和入度
int n,m;
void solve()
{
    cin>>n>>m;
    //n个点,m条边
    for(int i = 1;i<=m;i++){
        int x,y;
        cin>>x>>y;
        //x -> y
        ++in[y],++out[x];
        nei[x].push_back(y);
    }
    //入度为0的点
    for(int i = 1;i<=n;i++){
        if(in[i] == 0){
            num[i] = 1;//初始化
            q.push(i);
        }
    }
    while (!q.empty()){
        //当前点
        int top = q.front();
        q.pop();
        int len = nei[top].size();
        //遍历当前点的邻接点
        for(int i = 0 ; i < len ; i++){
            int next = nei[top][i];
            in[next]--;
            //删除当前结点,它的邻接点入度减一
            num[next] = (num[top] + num[next]) % 80112002;
            //更新邻接点的得到的边长

            if(in[next] == 0){
                q.push(nei[top][i]);
            }
            //如果邻接点入度为0,加入队列,作为一个单向图,最后一定会拓扑到终点
            //终点是出度为0的点
        }
    }
    for(int i = 1;i<=n;i++){
        if(out[i] == 0){
            ans = (ans + num[i]) % 80112002;
        }
        //如果是出度为0的点,说明是终点,加入答案
    }
    cout<<ans<<endl;
}
signed main(){

    solve();

}

到了这里,关于拓扑排序例题 P4017 最大食物链计数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 拓扑排序详解(包含算法原理图解、算法实现过程详解、算法例题变式全面讲解等)

    在图论中,如果一个有向图无法从某个顶点出发经过若干条边回到该点,则这个图是一个有向无环图(DAG图)。 如图所示。 对于一个有向图,若x点指向y点,则称x点为y点的入度。 对于一个有向图,若x点指向y点,则称y点为x点的出度。 队列是一种特殊的线性表,特殊之处在

    2024年02月07日
    浏览(37)
  • 【例题讲解】拓扑序列求解过程

    拓扑序列的含义:是求 有向无环图 的 拓扑序列 的方法。 拓扑序列过程:在有向图中任取一个入度为0的顶点,然后将它的值存入拓扑序列中,最后将该顶点以及以该顶点为弧尾的弧全部删掉。随后重新任取一个入度为0的顶点重复上述过程,直到没有一个入度为0的顶点或者

    2024年02月02日
    浏览(77)
  • 2353. 设计食物评分系统;1895. 最大的幻方;842. 将数组拆分成斐波那契序列

    2353. 设计食物评分系统 核心思想:首先明确我们有哪些功能,首先是修改某种食物分数的功能,然后第二点是能够每次弹出分数高字典序小的食物名字。由这两个我们想到了a = 食物[分数],b = 烹饪方式[分数,食物名字] 然后有一点经验的感觉,就是使用堆,每次从堆中弹出最

    2024年02月14日
    浏览(65)
  • 拓扑排序及逆拓扑排序

    拓扑排序其实就是对有向无环图的顶点的一种排序,每个顶点出现且只出现一次。 对一个AOV网进行拓扑排序的方法: 1、从AOV网中选择一个入度为0的顶点并输出; 2、从网中删除该顶点和所有以它为起点的有向边; 3、重复1和2直到当前的AOV网为空或当前网中不存在入度为0的

    2024年02月01日
    浏览(31)
  • 数据结构第12周 :( 有向无环图的拓扑排序 + 拓扑排序和关键路径 + 确定比赛名次 + 割点 )

    【问题描述】 由某个集合上的一个偏序得到该集合上的一个全序,这个操作被称为拓扑排序。偏序和全序的定义分别如下:若集合X上的关系R是自反的、反对称的和传递的,则称R是集合X上的偏序关系。设R是集合X上的偏序,如果对每个x,y∈X必有xRy或yRx,则称R是集合X上的全序

    2024年02月08日
    浏览(32)
  • 【算法基础】拓扑排序及实战

    这里涉及到图的概念,感兴趣的同学请移驾 –图– 下面还有两个相关概念,大概说一下: 定义:在图论中,如果一个有向图从任意顶点出发无法经过若干条边回到该点,则这个图是一个 有向无环图(DAG,Directed Acyclic Graph) 每条边都带有从一个顶点 指向另一个顶点 的方向

    2024年02月08日
    浏览(69)
  • 图论应用——拓扑排序

    拓扑排序的原理和宽度优先搜索差不多

    2024年04月26日
    浏览(22)
  • 算法沉淀——拓扑排序

    首先我们需要知道什么是拓扑排序? 在正式讲解拓扑排序这个算法之前,我们需要了解一些前置知识(和离散数学相关) 1、有向无环图: 指的是一个无回路的有向图。 入度:有向图中某点作为图中边的终点的次数之和 出度:有向图中某点作为图中边的起点的次数之和 2、

    2024年04月09日
    浏览(34)
  • 数据结构-拓扑排序

    一个无环的有向图称作有向无环图(Directed Acycline Graph),简称DAG图。 DAG图是描述含有公共子式的表达式的有效工具。 在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,称这种有向图为顶 点表示活动的网,简称AOV网。 AOV网中不能出现回路,而判

    2024年02月08日
    浏览(32)
  • 数据结构--拓扑排序

    A O V ⽹ color{red}AOV⽹ A O V ⽹ (Activity On Vertex NetWork,⽤顶点表示活动的⽹): ⽤ D A G 图 color{red}DAG图 D A G 图 (有向⽆环图)表示⼀个⼯程。顶点表示活动,有向边 V i , V j V_i, V_j V i ​ , V j ​ 表示活动Vi必须先于活动 V j V_j V j ​ 进⾏ 注:如果图中存在环路就不是 A O V 网 c

    2024年02月12日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包