news 2026/5/1 13:59:59

洛谷 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/1 4:58:57

内存检测方法

内存检测 导航 文章目录内存检测导航测试前的准备MemTest64TestMem5**Anta777 Extreme配置****MT配置**开始测试并观察结果正常结果常见问题及处理测试中蓝屏/死机长时间无响应测试前的准备 关闭后台程序&#xff1a;避免其他软件干扰测试结果确保散热良好&#xff1a;内存和…

作者头像 李华
网站建设 2026/5/1 7:10:51

Cython:为 Python 注入 C 的速度

Cython 是 Python 生态中一个强大而实用的工具,它允许开发者在保持 Python 代码可读性的同时,获得接近 C 语言的执行性能。本文将系统介绍 Cython 的基本概念、安装方法、使用示例,并澄清其与 CPython 的关系,同时探讨两种语法风格、性能分析手段及优化策略。 一、什么是 …

作者头像 李华
网站建设 2026/5/1 4:38:08

DeepSeek-AI突破传统视觉:像人类一样“聪明阅读“图像的AI模型

这项由DeepSeek-AI团队开展的研究发表于2025年1月&#xff0c;相关技术报告以arXiv:2601.20552的编号发布。对于想要深入了解技术细节的读者&#xff0c;可以通过该编号在学术数据库中查找完整论文。 当你拿起一本书开始阅读时&#xff0c;你的眼睛并不会机械地从左上角扫描到右…

作者头像 李华
网站建设 2026/5/1 5:00:08

Windows打印机文件PrintConfig.dll出现错误 免费下载方法分享

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

作者头像 李华
网站建设 2026/5/1 7:22:53

Next.js第二十四章(Prisma)

ORM框架(Object-Relational Mapping) 在传统开发模式中&#xff0c;我们需要把数据存储到数据库&#xff0c;所以需要通过SQL语句来进行操作&#xff0c;例如查询 新增 修改 删除等操作&#xff0c;但是SQL语句太多了&#xff0c;还比较繁琐&#xff0c;所以就有了ORM框架。 …

作者头像 李华
网站建设 2026/5/1 5:00:54

定制专属大模型只需打开浏览器!零代码微调全攻略

本文详细介绍了使用LLaMA-Factory Online平台进行大模型微调的全流程&#xff0c;涵盖GPU算力选型、部署方案对比、微调方法选择、安全评估、计费模式及存储优化策略。通过可视化界面&#xff0c;用户无需编写代码即可完成上百种预训练模型的微调&#xff0c;大幅降低技术门槛&…

作者头像 李华