题目选自洛谷P4017

这里具体讲一下为什么要用拓扑排序(思维过程):

1、这是一道图论题;

2、不是求最短路;

3、根据提示“最左端是不会捕食其他生物的生产者”可以想到,我们要入度为零的点开始查找;

4、再看一遍题目,就是求路径数,当且仅当一个点的入度变为零时才需要入队,并不是数据更新一次就要入队;

5、出度为零的点的路径总数和就是答案。

思路已经呼之欲出了:拓扑排序!

题目背景

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

题目描述

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

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

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

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

输入格式

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

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

输出格式

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

输入输出样例

输入 1

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

输出 1

5

说明/提示

各测试点满足以下约定:

解题代码:

#include<stdio.h>
#include<iostream>
#include<math.h>
#include<algorithm>
#include<queue>
#include<vector>
#define MOD 80112002
using namespace std;
int n,m,ans;
vector<int> p[5005];
queue<int> q;
int f[500005],ind[500005],outd[500005];//记录结果、入度、出度
int main(){cin>>n>>m;for(int i=1;i<=m;i++){int x,y;cin>>x>>y;outd[x]++; ind[y]++; //出度入度改变p[x].push_back(y); //邻接表存储图}memset(f,0,sizeof(f));for(int i=1;i<=n;i++){  //首先将所有入度为0的加入队列,代表食物链底层if(ind[i] == 0){q.push(i);f[i]=1;}}while(!q.empty()){int x = q.front();for(int i=0,sz=p[x].size();i<sz;i++){int y = p[x][i];f[y] = (f[x] + f[y]) % MOD;ind[y]--;if(ind[y]==0)  //如果入度为0了也加入队列q.push(y);}q.pop();}for(int i=1;i<=n;i++) //统计所有出度为0的点即为结果if(outd[i] == 0) ans = (ans+f[i]) % MOD;cout<<ans<<endl;return 0;
}

拓扑排序——最大食物链计数(洛谷 P4017)相关推荐

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

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

  2. 信息学奥赛一本通 1316:【例4.6】数的计数(Noip2001) | 1914:【01NOIP普及组】数的计数 | 洛谷 P1028 [NOIP2001 普及组] 数的计算

    [题目链接] ybt 1316:[例4.6]数的计数(Noip2001) ybt 1914:[01NOIP普及组]数的计数 洛谷 P1028 [NOIP2001 普及组] 数的计算 [题目考点] 1. ...

  3. 洛谷 P4017 最大食物链计数

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

  4. #容斥,组合计数#洛谷 3214 卡农

    题目 在集合S=[1∼n]S=[1\sim n]S=[1∼n]中选出mmm个子集,满足三点性质: 所有选出的mmm个子集都不能为空. 所有选出的mmm个子集中,不能存在两个完全一样的集合. 所有选出的 ...

  5. 洛谷 最大食物链计数 python题解

    题目:P4017 最大食物链计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 给你一个食物网,你要求出这个食物网中最大食物链的数量. (这里的"最大食物链&q ...

  6. 洛谷--橙色百道DP总结

    最近刷完了洛谷橙色DP大约一百道,算是发现了一些套路,就部分题目做一些总结. 大概分为三类 第一类,九大背包及其衍生 第二类,经典DP模型,如LCS,LIS等 第三类,实际问题背景的普通,环形,树上D ...

  7. 洛谷or牛客数据结构+算法

    栈思想:先进后出 tips:栈里能放下标就放下标 (牛客)小c的计事本(直接用stack可以简化代码,且不会被自己绕晕,当时没意识到) (牛客)吐泡泡(没意识到用栈),(牛客)好串 1.后缀表达式(栈 ...

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

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

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

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

最新文章

  1. #HTTP协议学习# (二)基本认证
  2. 内核变量——Jiffies
  3. es中的DiscoveryModule
  4. Vector Clock理解
  5. PowerDesigner将PDM导出生成WORD文档
  6. 以色辨位的Farmer(洛谷P5832题题解,Java语言描述)
  7. js怎么图表在html中显示,使用Charts.js在HTML5中创建图表
  8. MySQL-(1)查看用户权限、(2)用户授权、(3)删除用户权限 语法格式总结
  9. ant 使用java 运行类_用ANT构建java可执行程序
  10. 【写博客常用】美赛成绩如何快速查询!
  11. Django 中文文档解析
  12. python控制51单片机的红绿灯_51单片机实现红绿灯控制的代码+Proteus仿真
  13. 我在首席数据官年会上的演讲实录
  14. 微信授权能获取那些数据字段,微信授权获取的字段,微信授权能获取到的数据,微信授权
  15. Java——LocalDateTime
  16. 写个日志请求切面,前后端甩锅更方便
  17. 最全面的免费格式在线转换工具?这8个网站简直打开了新世界的大门!
  18. 与ZoomEye(钟馗之眼)功能相似的搜索引擎
  19. DZ论坛批量去除隐藏
  20. 华为云计算相关知识点

热门文章

  1. 易宝典文章——用ISA 2006标准版发布Exchange 2010的OWA系列之生成Exchange证书申请文件...
  2. Android应用程序启动过程源代码分析(5)
  3. pll制作分频器_PLL学习过程记录
  4. raspberry pi_如何使用Raspberry Pi构建WiFi相框
  5. raspberry pi_如何使用Raspberry Pi测量颗粒物
  6. pycon视频_观看6个PyCon 2015社区相关视频
  7. 建立一个成功的OpenStack组
  8. 优必选能开放软硬件源代码吗_四个项目供父母教孩子如何使用开放式硬件和电子产品...
  9. Bootstrap3 滚动监听插件的事件
  10. Bootstrap导航条中组件的排列