news 2026/5/12 16:02:43

洛谷 P4017 最大食物链计数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
洛谷 P4017 最大食物链计数

【题目链接】

洛谷 P4017 最大食物链计数

【题目考点】

1. 有向无环图动规,拓扑排序

【解题思路】

每个生物是一个顶点。
如果A被B吃,或者说B吃A,那么A到B有一条有向边,有向边的方向代表能量流动的方向。
食物链构成的网中一定没有环,该图是有向无环图。
一条食物链的左端是“不会捕食其他生物的生产者”,即它不会吃其它生物,不会有能量流向该生物,那么其它顶点到“生产者”顶点没有边,即“不会捕食其他生物的生产者”顶点的入度为0。
一条食物链的右端是“不会被其他生物捕食的消费者”,即该生物的能量不会流向其它生物,那么该顶点到其它顶点没有边,即“不会被其他生物捕食的消费者”顶点的出度为0。

该题求从图中入度为0的顶点到出度为0的顶点的路径数量。

状态定义

  • 阶段:到达某个顶点
  • 决策:下一步到哪个邻接点
  • 策略:路径
  • 策略集合:从入度为0的顶点出发到达某顶点的所有路径
  • 统计量:路径数

状态定义d p i dp_idpi:从入度为0的顶点出发到达顶点i的路径数。
对于入度为0的顶点u,到达顶点u的路径数为1,因此d p u = 1 dp_u=1dpu=1

状态转移方程

  • 策略集合:从入度为0的顶点出发到达顶点v的所有路径
  • 分割策略集合:根据到达顶点v的前一个顶点的不同情况分割策略集合。

设模数M = 80112002 M=80112002M=80112002
如果到达顶点v的前一个顶点为顶点u,顶点u到顶点v有一条边<u, v>。
那么每条到达顶点u的路径,在加上边<u, v>,都可以形成一条到达顶点v的路径。
到达顶点v的路径的数量需要增加到达顶点u的路径的数量,再对模数M取模。
对于每个到v有边的顶点u,都需要让到达顶点v的路径数量增加到达顶点u的路径数。
因此状态转移方程为:d p v = ∑ < u , v > ∈ E { d p u } m o d M dp_v = \sum\limits_{<u,v>\in E}\{dp_u\}\bmod Mdpv=<u,v>∈E{dpu}modM
E EE为图的边集。< u , v > ∈ E < u,v >\in E<u,v>∈E表示图中存在边<u, v>。

要想先访问所有到顶点v有边的顶点u,再访问顶点v,需要按照拓扑排序的顺序访问各个顶点。在拓扑排序的过程中进行动规,即可求出状态数组d p dpdp

最后遍历所有顶点,对出度为0的顶点的路径数加和并对模数取模,即可得到本题的答案。
遍历所有顶点的过程,可以写for循环遍历所有顶点的编号,也可以在拓扑排序过程中顶点出队时对出队的顶点做处理。拓扑排序的过程也是对图中顶点遍历的过程。

【题解代码】

解法1:拓扑排序+动规
#include<bits/stdc++.h>#defineINF0x3f3f3f3fusingnamespacestd;constintN=5005,M=80112002;vector<int>edge[N];//edge[i]:顶点i的邻接点intn,m,degIn[N],degOut[N],dp[N],ans;//dp[i]:从入度为0的顶点到顶点i的路径数量voidtopoSort(){queue<int>que;for(inti=1;i<=n;++i)if(degIn[i]==0){que.push(i);dp[i]=1;}while(!que.empty()){intu=que.front();que.pop();if(degOut[u]==0)//拓扑排序的过程也是对图遍历的过程,u出队时dp[u]已经求好了。ans=(ans+dp[u])%M;for(intv:edge[u]){dp[v]=(dp[v]+dp[u])%M;if(--degIn[v]==0)que.push(v);}}}intmain(){intf,t;cin>>n>>m;for(inti=1;i<=m;++i){cin>>f>>t;edge[f].push_back(t);degIn[t]++,degOut[f]++;//degIn[i]:顶点i的入度 degOut[i]:顶点i的出度}topoSort();cout<<ans;return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/11 0:40:02

2026年汕头GEO优化公司推荐TOP3:从技术实力到效果落地深度评估

在数字营销的浪潮中&#xff0c;GEO优化已成为企业提升线上竞争力的关键手段。在汕头&#xff0c;众多GEO优化公司如雨后春笋般涌现&#xff0c;为了帮助企业挑选出最适合的合作伙伴&#xff0c;我们从技术实力到效果落地进行了深度评估&#xff0c;为大家推荐2026年汕头GEO优化…

作者头像 李华
网站建设 2026/5/11 0:42:11

【大数据分析毕设选题】基于Spark的美食数据可视化系统完整源码分享 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘

✍✍计算机毕设指导师** ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡有什么问题可以…

作者头像 李华
网站建设 2026/5/11 0:22:15

巴菲特如何评估企业的竞争优势

巴菲特如何评估企业的竞争优势关键词&#xff1a;巴菲特、企业竞争优势、评估方法、经济护城河、财务指标摘要&#xff1a;本文深入探讨了巴菲特评估企业竞争优势的方法和理念。从背景介绍入手&#xff0c;阐述了研究该主题的目的、预期读者和文档结构。接着详细讲解了巴菲特所…

作者头像 李华
网站建设 2026/5/10 3:43:02

printui.dll文件丢失找不到问题 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/5/11 0:22:55

小程序毕设项目:基于springboot健身房预约平台小程序的设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华