news 2026/3/8 0:53:06

洛谷 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/2/25 2:46:26

15寸工控屏:友达G150XVN01.0液晶模组参数分析及维护指南

在工业自动化与医疗监控领域&#xff0c;15英寸、4:3比例的显示终端凭借其稳定的结构和成熟的驱动方案&#xff0c;一直保持着极高的存量。作为友达光电&#xff08;AUO&#xff09;旗下的代表作&#xff0c;G150XVN01.0 虽然已于2020年停止大规模量产&#xff0c;但其在现有设…

作者头像 李华
网站建设 2026/3/5 21:49:38

探索 Flow 在 Android 开发中的应用

探索 Flow 在 Android 开发中的应用 在 Android 开发转向 Kotlin 优先的浪潮中&#xff0c;Flow 作为 Kotlin 原生的响应式数据流方案&#xff0c;以简洁、易懂、无额外依赖的优势&#xff0c;成为解决异步数据处理问题的利器。对于初学者而言&#xff0c;掌握 Flow 不仅能告别…

作者头像 李华
网站建设 2026/3/4 19:48:38

人大与百度联合攻克AI工具使用的细粒度监督难题

当我们教孩子做作业时&#xff0c;如果只在最后检查对错而不指出每一步的问题&#xff0c;孩子很难知道哪里做得好、哪里需要改进。同样的道理&#xff0c;在训练人工智能使用各种工具时&#xff0c;传统方法也存在这个问题——只看最终结果是否正确&#xff0c;却无法准确评判…

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

北大团队:三步法提升视频AI视觉推理能力

这项由北京大学领导、联合快手科技、中山大学、浙江大学和南京大学的研究发表于2025年&#xff0c;论文编号为arXiv:2601.10061v1。有兴趣深入了解的读者可以通过该编号查询完整论文。当我们让AI根据文字描述生成图片时&#xff0c;经常会遇到这样的困扰&#xff1a;描述一只&q…

作者头像 李华
网站建设 2026/3/7 9:09:57

Java毕设项目推荐-基于 Spring Boot+MySQL 的酒店运营管理系统基于springboot的酒店管理系统【附源码+文档,调试定制服务】

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

作者头像 李华
网站建设 2026/2/20 7:12:10

Vue day4

1.什么是prop 1.1props校验 1.2prop&data和单向数据流 2.非父子通信 2.1event bus事件总线 2.2provide&inject 3.v-model原理 3.1表单组件封装&#xff08;v-model&#xff09; 4. .sync修饰符 5.ref和$refs 6.Vue异步更新 $nextTick

作者头像 李华