拓扑排序
拓扑排序(topological-sort)是指由某个集合上的一个偏序得到该集合上的一个全序的操作。拓扑排序常用来确定一个依赖关系集中,事物发生的顺序
拓扑排序是对有向无环图的顶点的一种排序,它使得如果存在一条从顶点A到顶点B的路径,那么在排序中B出现在A的后面。


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

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

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

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

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

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

输入输出样例
输入
5 7
1 2
1 3
2 3
3 5
2 5
4 5
3 4
输出
5
说明/提示
各测试点满足以下约定:

洛谷题目链接


解题思路
①、对于图论类型有向无环图的题,可以采用拓扑排序。
②、对每个节点的路径进行逐个递推,最终每个有向无环的终点之和便是答案。
ps:在拓扑排序里,每个点只会入队一次,每条边只会通过一次,时间复杂度为O(N+M)。
洛谷题解

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll total[5010], ans=0;
int start[5010], end[5010];
vector <int> g[5010]; //采用邻接表int main(){int n, m, a, b;cin.tie(0);ios::sync_with_stdio(false); memset(total, 0, sizeof(total));memset(start, 0, sizeof(start));memset(end, 0, sizeof(end));cin>>n>>m;for(int i=1; i<=m; i++){cin>>a>>b;start[a]++;           //记录 a 有多少条出路 end[b]++;           //记录有多少条路径能到达 b g[a].push_back(b);  //a 可到达 b}//插入全部起点 queue <int> q;for(int i=1; i<=n; i++){if(end[i]==0){  //没有路径能到达 i,i为起点total[i]=1;q.push(i);}}while(!q.empty()){int tmp=q.front();q.pop();//扫描tmp能到达的节点for(int i=0; i<g[tmp].size(); i++){int k=g[tmp][i];total[k] = (total[k]+total[tmp])%80112002;end[k]--;                //少一条能到达 k 的路径 if(end[k]==0){         //没有路径能到达 k if(start[k]==0){  // k 没有出路 ans = (ans + total[k])%80112002;}else{q.push(k);}}}}cout<<ans; return 0;
}

一直将自己的学习经验分享给有需要的人。
我是小郑,一个坚持不懈的小白

拓扑排序(最大食物链计数、图文结合)相关推荐

  1. 拓扑排序——最大食物链计数(洛谷 P4017)

    题目选自洛谷P4017 这里具体讲一下为什么要用拓扑排序(思维过程): 1.这是一道图论题: 2.不是求最短路: 3.根据提示"最左端是不会捕食其他生物的生产者"可以想到,我们要入 ...

  2. java 有向无环图 树_拓扑排序-有向无环图(DAG, Directed Acyclic Graph)

    条件: 1.每个顶点出现且只出现一次. 2.若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面. 有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说. 一 ...

  3. 可达性统计(拓扑排序)

    描述 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量.N,M≤30000. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到y的一条有向边. 输出格式 ...

  4. 拓扑排序三题(菜肴制作杂物最大食物链计数)

    目录 一.[HNOI]2015菜肴制作 二.洛谷1113杂物 代码一: 代码二: 三.最大食物链计数[洛谷4017] DAG:有向无环图 图的建立很重要 一.[HNOI]2015菜肴制作 传送门1 思 ...

  5. 图解Topo拓扑排序 例题洛谷P4017 最大食物链计数

    适用条件:无环图 输出结果:使得每个节点,以它为终点的起点节点排都在其前面 作用:递推保证前面的节点都已经被使用过 实现方法:从没有入边的节点开始,输出并从其他节点中删去自己,重复此步骤直到所有节点都 ...

  6. 解题记录 P4017 最大食物链计数 拓扑排序

    题意: 给你一个食物链 DAG, 求最多有多少条食物链, 对结果取余 8011200280112002 思路: 想要找到一条 最大食物链 ,那么这条路径的 起点 入度要为0,终点 出度要为0. 故:既 ...

  7. 拓扑排序(topo_sort)

    拓扑排序 预备知识 ​   一个较大的工程往往被划分成许多子工程,我们把这些子工程称作活动(activity).在整个工程中,有些子工程(活动)必须在其它有关子工程完成之后才能开始,也就是说,一个子工 ...

  8. 拓扑排序介绍及其应用

    拓扑排序简介 拓扑排序是一种图论排序方式,要了解拓扑排序,首先要了解两个图论概念:入度和出度.在有向无环图( D A G DAG DAG)中,一个点是多少弧的弧头称为入度,是多少弧的弧尾是出度. 而作 ...

  9. 图论---拓扑排序的应用

    最近研究了几道图论的题目,都是图论入门的算法,用的比较多的就是拓扑排序,多用于有着先后顺序的题目,也可以用来判断环,做个小总结. 杂物 题目链接:杂务 - 洛谷 这一题需要计算最短的时间,利用了记忆化 ...

最新文章

  1. 用ESP32怎么实现离线语音
  2. 由苹果审核悲剧引发的“血案”
  3. 【转】JMeter学习(六)集合点
  4. SAP Commerce的extensioninfo.xml
  5. 看看30万码农怎么评论:培训出来的程序员真的很渣吗?
  6. 本周三、四两场直播丨达梦 vs. Oracle,从快速入门到性能分析优化
  7. 《银花季刊》版式海报欣赏,看大咖的神操作
  8. Java基础学习总结(132)——Java8 Stream流操作学习总结
  9. 反应特别慢_孩子反应总是很迟钝?家长多注意一点孩子的兴趣培养
  10. 【转】MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)
  11. GrADS读取.grb2文件记录
  12. 《JavaSE系列教程》
  13. Linux安装phpstudy
  14. tumblr_将您的Tumblr博客与社交网络集成
  15. 从乡巴佬到世界首富,连续7年蝉联全球最大公司:真正厉害的人,都敢于不走寻常路...
  16. IDEA从零到精通(21)之使用Maven clean发生错误Process terminated
  17. 强网杯2022 pwn 赛题解析——yakacmp
  18. 黑客逆向破解基础-3:如何识别程序加的什么壳
  19. MySql基础语法-java学习
  20. 双网卡实现同时连通两个网络

热门文章

  1. ★为什么不要和“穷人”做朋友?
  2. 让你低调的app脱颖而出
  3. 马云说:“未来是大数据的时代”
  4. 谷歌为AI再上“紧箍咒”:道德团队审查产品,确保AI不作恶
  5. c 语言指针数组长度,c如何获取指针数组的长度?
  6. p4交换机模拟器bmv2的一些教程
  7. 女生被逼疯的日记(课余篇)
  8. android自定义美颜相机,效果最自然 美颜相机for Android版更新
  9. P4084 [USACO17DEC]Barn Painting
  10. 揪出Android流氓软件