网络流二十四题解题报告
网络流二十四题解题报告
机器人路径规划问题
数据有误,不计入解题报告中
1. 飞行员配对方案问题
构造二分图,把每个正驾驶员当成左部点,副驾驶员当成右部点
若正驾驶员
答案即为二分图最大匹配的大小
2. 太空飞行计划问题
考虑最大权权闭合子图,对于每个实验
此时我们在闭合子图中选取实验
因此求这张图的最大权闭合子图,子图中选择的实验和器材就是最终方案里的实验和方案
3. 最小路径覆盖问题
二分图匹配解最小路径覆盖模板题,对于每条边
每条匹配边
4. 魔术球问题
首先考虑判定
我们不需要考虑二分,考虑增量算法,每次新加入一个点,然后连边判断即可,如果加入某个 break
掉并返回
注意最后输出方案的时候由于连边是从大到小的,而输出路径要求是从小到大,因此要反过来输出
5. 圆桌问题
考虑网络流做一个类似二分图匹配的过程,对国家建立节点
- 连接
,容量为 ,表示一个国家有 个要匹配 - 连接
,容量为 ,表示一个餐桌至多坐 个人 - 对于所有
,连接 ,容量为 ,表示 国家有没有一个人坐 号桌子
求出网络上的最大流,如果与
6. 最长不下降子序列问题
第一问先 dp 求出最大长度
因为每个点至多被选一次,因此考虑拆点,把每个点
- 连接
,容量为 ,表示 至多使用一次 - 对于所有
的 ,连接 ,容量为 ,表示可以从 这个位置开始 - 对于所有
的 ,连接 ,容量为 ,表示可以从 这个位置结束 - 对于所有在 dp 过程中能从
转移到 的 ,连接 ,容量为 ,表示 在子序列中可以接在 的后面
第三问复制第二问的图,如果
注意特判
7. 试题库问题
拆点,设类型
求这个二分图上的最大匹配,判断其大小是否为
8. 方格取数问题
对网格黑白染色,在相邻的位置之间连边,能够得到一张二分图,答案转化为求这张二分图的最大权独立集
将最大权独立集对偶成点权和减去最小权覆盖集
对于最小权覆盖集,我们可以通过如下方式解决:
- 对于某个左部点
,连接 ,容量为 - 对于某个右部点
,连接 ,容量为 - 对于某条原本在二分图的边
,连接 ,容量为
此时对于原本在二分图中的一条边
根据最小权点覆盖计算出最大权独立集的大小即可
9. 餐巾计划问题
考虑对于每个日期
- 连接
,容量为 ,费用为 ,表示第 天要供应 条毛巾 - 连接
,容量为 ,费用为 ,表示第 天结束时可以得到 条脏毛巾 - 连接
,容量为 ,费用为 ,表示第 天可以留下任意多条脏毛巾到下一天清洗 - 连接
,容量为 ,费用为 ,表示第 天可以留下任意多条干净毛巾到下一天使用 - 连接
,容量为 ,费用为 ,表示第 天可以 的单价购买任意多的干净毛巾,当天立即获得 - 连接
,容量为 ,费用为 ,表示第 天可以以 的单价将任意多条毛巾送去快洗, 天时获得 - 连接
,容量为 ,费用为 ,表示第 天可以以 的单价将任意多条毛巾送去快洗, 天时获得
我们只需要求出这个网络上的最小费用最大流,其费用即为答案
10. 软件补丁问题
对错误状态状压,把每个补丁看成一条边,求最短路即可
11. 数字梯形问题
对于问题一:
先对每个位置
- 连接
,容量为 ,费用为 ,表示需要恰好一条从 出发的路径,走到 后获得价值 - 连接
,容量为 ,费用为 ,表示每个点至多被访问一次 - 连接
,容量均为 ,费用分别为 ,表示走到下一层的两个位置获得相应的价值 - 连接
,容量为 ,费用为 ,表示至多一条路径以 结尾
对于问题二:
不需要拆点,按如下方式构图:
- 连接
,容量为 ,费用为 ,表示需要恰好一条从 出发的路径,走到 后获得价值 - 连接
,容量均为 ,费用分别为 ,表示每条边至多被走一次,走到下一层的两个位置获得相应的价值 - 连接
,容量为 ,费用为 ,表示任意条路径以 结尾
对于问题三:
不需要拆点,按如下方式构图:
- 连接
,容量为 ,费用为 ,表示需要恰好一条从 出发的路径,走到 后获得价值 - 连接
,容量均为 ,费用分别为 ,表示每条边可以走任意次,走到下一层的两个位置获得相应的价值 - 连接
,容量为 ,费用为 ,表示任意条路径以 结尾
三个问题的答案分别为这三个网络上的最大费用最大流的费用
12. 运输问题
按如下方式构图:
- 对于每个仓库
,连接 ,容量为 ,费用为 ,表示第 个仓库里有 件货物 - 对于每个商店
,连接 ,容量为 ,费用为 ,表示第 个商店需要 件货物 - 对于每个仓库
和商店 ,连接 ,容量为 ,费用为 ,表示从第 个仓库到第 个商店可以以 的单价运输任意数量的货物
两个问题的答案即分别为这个网络上的最小费用最大流和最大费用最大流
13. 分配问题
人看成左部点,任务看成右部点,最大价值直接求二分图最大权完美匹配即可
最小价值可以选取一个足够大的值
14. 负载平衡问题
先求出
- 对于每个
的 连接 ,容量为 ,费用为 ,表示 变成 需要有 件货物被运出 - 对于每个
的 连接 ,容量为 ,费用为 ,表示 变成 需要有 件货物被运入 - 连接
,容量为 ,费用为 ,表示可以以 的单价将任意多件 中的货品运到 或 上
答案即为这个网络上的最小费用最大流
15. 最长 k 可重区间集问题
考虑对于一个
对于一个互不相交的区间构成的集合,我们把区间从左至右排序,可以把这个区间集看成一条链
因此假如我们对于所有
由于一个区间至多在一条链中,因此仍然需要拆点,对于每个区间
- 连接
,容量为 ,费用为 ,表示至多拆分成 条链 - 连接
,容量为 ,费用为 ,表示每个点至多作为一条链的起点 - 连接
,容量为 ,费用为 ,表示每个点至多作为一条链的终点 - 连接
,容量为 ,费用为 ,表示每个区间至多被选择一次,且选择该区间的价值为 - 对于所有
的 ,连接 ,容量为 ,费用为 ,表示区间 能与区间 划分在同一个链中(如果同时连接 和 可能会在残量网络上产生正环导致无法进行增广,因此要为每条边定向)
答案即为这个网络上的最大费用最大流
16. 星际转移问题
考虑增量算法,即从小到大枚举时间
而对于一个确定的
17. 孤岛营救问题
对获得钥匙的状态进行状压,并且以获得钥匙的状态进行分层,由于边权只有
18. 航空路线问题
把
答案即为网络上的最大费用最大流,注意特判
19. 汽车加油行驶问题
对汽车剩余油量进行分层,在分层图上模拟建边跑最短路即可,注意加油站是强制消费的
20. 深海机器人问题
本题是比较显然的费用流,需要处理的是“每条边只有第一次经过才能获得权值”的限制,考虑拆成一条容量为
- 连接
,容量为 ,费用为这条路径上生物标本的价值,表示第一个走这条路径的机器人能够获得相应的价值 - 连接
,容量为 ,费用为 ,表示后面走这条路径的机器人无法获得价值,但依然可以通过这条路径 - 对于每个起点
连接 ,容量为 ,费用为 ,表示从 出发的有 个机器人 - 对于每个起点
连接 ,容量为 ,费用为 ,表示在 结束的有 个机器人
答案即为这个网络上的最大费用最大流
21. 火星探险问题
类似上一题,不过这一次需要先拆点再对点分流贡献,按如下方式构图:
- 连接
,容量为 ,费用为 ,表示 辆探险车从 出发 - 连接
,容量为 ,费用为 ,表示至多 辆探险车到达 处才能被统计贡献 - 对于
,连接 ,容量为 ,费用为 ,表示可以经过空地任意次 - 对于
,断开 ,表示到达这里之后不能继续前进 - 对于
,连接 ,容量为 ,费用为 ,表示第一个经过这里的机器人可以获得 块样本,再连接 ,容量为 ,费用为 ,表示之后到这里的机器人可以经过这里任意次 - 连接所有
,容量为 ,费用为 ,表示机器人向南走或者向东走
答案即为网络上的最大费用最大流,输出答案的时候进行
22. 骑士共存问题
将所有互相攻击的点对连起来,发现对网格图黑白染色之后会形成二分图,因此答案即为二分图上最大独立集大小
用所有未被删除的点的数量减去二分图的最大匹配的大小即得到答案,注意本题数据范围朴素的增广路算法无法通过,请使用 HK 算法或最大流解决此题
23. 最长 k 可重线段集
和第 15 题基本一致,注意可重线段可能出现两条
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效