news 2026/6/10 20:51:07

洛谷 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/6/10 9:15:47

2026年1月衢州GEO优化公司推荐TOP4:从技术实力到行业适配的测评

在当今数字化营销浪潮中&#xff0c;GEO优化成为企业提升线上曝光与营销效果的关键手段。在衢州地区&#xff0c;众多GEO优化公司各展所长&#xff0c;为了帮助企业找到最适合的合作伙伴&#xff0c;我们从技术实力、行业适配等多维度对当地公司进行测评&#xff0c;为大家带来…

作者头像 李华
网站建设 2026/6/10 10:55:37

MacOS启动盘制作(可多合一),并实现MacOS降版本

MacOS启动盘制作&#xff08;可多合一&#xff09;&#xff0c;并实现MacOS降版本 文章目录MacOS启动盘制作&#xff08;可多合一&#xff09;&#xff0c;并实现MacOS降版本一、前言二、前提准备三、下载MacOS镜像四、格式化U盘五、写入安装器六、降版本一、前言 此文章用于记…

作者头像 李华
网站建设 2026/6/10 8:23:09

AI原生应用领域人机共创的典型案例分析

AI原生应用领域人机共创的典型案例分析关键词&#xff1a;AI原生应用、人机共创、生成式AI、提示词工程、多模态创作摘要&#xff1a;本文以AI原生应用中的"人机共创"为核心&#xff0c;通过5大典型案例拆解人类与AI协作的底层逻辑。我们将从"什么是AI原生应用&…

作者头像 李华
网站建设 2026/6/10 8:26:31

计算机小程序毕设实战-基于微信小程序+SpringBoot的健身房课程预约选课管理系统基于springboot健身房预约平台小程序的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

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

作者头像 李华
网站建设 2026/6/10 8:22:58

读取CO2传感器数据

通过指定串口发送 Modbus 指令&#xff0c;读取设备 Vin6 通道的 16 位模拟量传感器数据&#xff0c;经工业标度转换公式计算为 CO₂浓度&#xff08;ppm&#xff09;并在可视化界面展示&#xff0c;同时支持串口的连接 / 断开、数据解析异常处理等功能&#xff0c;专为 COM100…

作者头像 李华
网站建设 2026/6/9 23:31:10

计算机等级考试—结构化语言模板—东方仙盟练气期

模板 1&#xff1a;数据校验类&#xff08;如 “用户注册信息校验”&#xff09; DO步骤1&#xff1a;接收用户提交的注册信息&#xff08;账号、密码、手机号&#xff09;&#xff1b;步骤2&#xff1a;初始化校验结果为“通过”&#xff1b;步骤3&#xff1a;检查账号长度是否…

作者头像 李华