洛谷 P4017 最大食物链计数

洛谷传送门

题目背景

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

题目描述

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

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

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

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

输入格式

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

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

输出格式

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

输入输出样例

输入 #1复制

输出 #1复制

说明/提示

各测试点满足以下约定:

【补充说明】

数据中不会出现环,满足生物学的要求。(感谢@AKEE )

题解:

一道拓扑排序的好题。

前置知识是拓扑排序。如有不会的小伙伴请移步:

拓扑排序详解

我个人认为拓扑排序本身并没有特别难以理解,但是应用在题目上却并不是那么容易。

首先我们发现这道题是一道图论题。(这个要是看不出来可真的GG了)

对于图论题,我们要好好分析题目大意,据此判断模板和算法。那么这道题为什么要用拓扑排序呢

首先,我们要找最大食物链,最大食物链是什么呢?根据题目的描述,是最猛的那种生物不能被任何生物吃掉,最弱的生物不能吃任何生物。类比到图上,就是从一个入度为0的点,到一个出度为0的点。我们只需要找出所有这种数量即可。

用递推即可解决计数的问题:

  1. #include<cstdio>
  2. #include<queue>
  3. using namespace std;
  4. const int maxn=5010;
  5. const int maxm=5*1e5+10;
  6. const int mod=80112002;
  7. char *p1,*p2,buf[100000];
  8. #define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
  9. int read()
  10. {
  11. int x=0,f=1;
  12. char ch=nc();
  13. while(ch<48){if(ch=='-')f=-1;ch=nc();}
  14. while(ch>47) x=(((x<<2)+x)<<1)+ch-48,ch=nc();
  15. return x*f;
  16. }
  17. int n,m;
  18. int tot,head[maxn],nxt[maxm],to[maxm];
  19. int chudu[maxn],rudu[maxn];
  20. int f[maxn],ans;
  21. queue<int> q;
  22. void add(int x,int y)
  23. {
  24. to[++tot]=y;
  25. nxt[tot]=head[x];
  26. head[x]=tot;
  27. }
  28. int main()
  29. {
  30. n=read();m=read();
  31. for(int i=1;i<=m;i++)
  32. {
  33. int a=read();
  34. int b=read();
  35. add(a,b);
  36. rudu[b]++;
  37. chudu[a]++;
  38. }
  39. for(int i=1;i<=n;i++)
  40. if(rudu[i]==0)
  41. f[i]=1,q.push(i);
  42. while(!q.empty())
  43. {
  44. int x=q.front();
  45. q.pop();
  46. for(int i=head[x];i;i=nxt[i])
  47. {
  48. int y=to[i];
  49. f[y]=(f[y]+f[x])%mod;
  50. rudu[y]--;
  51. if(rudu[y]==0)
  52. {
  53. q.push(y);
  54. if(chudu[y]==0)
  55. ans=(ans+f[y])%mod;
  56. }
  57. }
  58. }
  59. printf("%d",ans);
  60. return 0;
  61. }

洛谷 P4017 最大食物链计数的更多相关文章

  1. 动态规划 洛谷P4017 最大食物链计数——图上动态规划 拓扑排序

    洛谷P4017 最大食物链计数 这是洛谷一题普及/提高-的题目,也是我第一次做的一题 图上动态规划/拓扑排序 ,我认为这题是很好的学习拓扑排序的题目. 在这题中,我学到了几个名词,入度,出度,及没有环 ...

  2. 洛谷——P4017 最大食物链计数

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

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

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

  4. 洛谷 P4017 最大食物链计数 (拓扑排序,思维)

    题意:有\(n\)个点,连\(m\)条边,求最多有多少条食物链(从头走到为有多少条路径). 题解:之前抽了点时间把拓扑排序补完了,这题其实就是一道拓扑排序的裸题.关于拓扑排序: ​ 1.首先,我们用\ ...

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

    拓扑排序板子题 #include <iostream> #include <cstdio> #include <cstring> #include <queu ...

  6. 洛谷P4017 最大食物链数量 dfs

    老规矩,传送门 做题从头到尾的思路: 1. 这个题明显就是dfs数数量了,简单,邻接矩阵干他! TLE警告,8个点 额... 2. 老师说这玩意不能邻接矩阵?没事,还有邻接表,再来! 再次TLE 8个 ...

  7. 洛谷 P1596 [USACO10OCT]湖计数Lake Counting

    题目链接 https://www.luogu.org/problemnew/show/P1596 题目描述 Due to recent rains, water has pooled in vario ...

  8. 洛谷P1144 最短路计数(SPFA)

    To 洛谷.1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M ...

  9. 洛谷 1144 最短路计数 bfs

    洛谷1144 最短路计数 传送门 其实这道题目的正解应该是spfa里面加一些处理,,然而,,然而,,既然它是无权图,,那么就直接bfs了,用一个cnt记录一下每一个点的方案数,分几种情况讨论一下转移, ...

随机推荐

  1. 红黑树原理详解及golang实现

    目录 红黑树原理详解及golang实现 二叉查找树 性质 红黑树 性质 operation 红黑树的插入 golang实现 类型定义 leftRotate RightRotate Item Inter ...

  2. How to: Display a List of Non-Persistent Objects in a Popup Dialog 如何:在弹出对话框中显示非持久化对象列表

    This example demonstrates how to populate and display a list of objects that are not bound to the da ...

  3. GO基础之异常处理

    一.异常 1. 错误指程序中出现不正常的情况,从而导致程序无法正常执行.•大多语言中使用try... catch... finally语句执行.假设我们正在尝试打开一个文件,文件系统中不存在这个文件. ...

  4. Logo(图片)作为报表水印的解决方法

    概述 在<像 word 一样增加水印功能>中,已经介绍了如何在润乾报表中增加文字水印功能,包括了静态及动态水印.水印功能将标识信息嵌入到报表载体后,使得信息安全.版权保护有了更有效的方法. ...

  5. Dynamics 365需要的最小的权限用来更改用户的业务部门和角色

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  6. 嵌入Canvas App到Dynamics 365 Customer Engagement(Model-Driven App)中,创造更多可能!

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  7. C lang:character input and output (I/O)

    Xx_Introduction Character input and output is by more line character conpose of the text flow  Defin ...

  8. MySQL能否授予查看存储过程定义权限给用户

    在其他RDBMS中,可以将查看某个存储过程(PROCEDURE)定义的权限给某个用户,例如在SQL Server中,可以单独将查看ProcedureName定义的权限授予UserA GRANT VIE ...

  9. vue项目、路由

    目录 Vue项目创建 pycharm配置并启动vue项目 vue项目目录结构分析 js原型补充 vue项目生命周期 页面组件 配置自定义全局样式 路由逻辑跳转 路由重定向 组件的生命周期钩子 路由传参 ...

  10. 查看/运行jpynb文件

    Windows OS:安装好pip包,能使用pip进行安装第三方包. cmd命令行: pip install jupyter jupyter notebook cd (xx.jpynb文件所在文件夹) ...