知识焦点
先建立概念地图
- 流网络
- 最大流
- 最小费用流
- 线性规划
- 博弈论
- 顶点覆盖
- 集合覆盖
- NP完全性
CS170 · 作业 10
本题册涵盖流网络建模、最大流、最小费用流、线性规划、博弈论、顶点覆盖、集合覆盖以及决策/搜索/优化问题的等价性。包括秘密特工逃生路线、健身房教练招聘、加权石头剪刀布、策略支配、顶点覆盖到集合覆盖的归约以及最小费用流等题目。
知识焦点
建议顺序
先完整作答,再按需展开提示;最后才展开官方参考解答并逐步核对证明与计算。
本地来源
题面与解答均由本地一手资料整理:hw10.pdf、hw10-sol.pdf
本地一手资料完整提取 · 作业
本节按本地一手资料完整整理,共 8 道大题。本地官方解答已收录 7/8 道并默认折叠;其余题目会明确标注无本地官方解答。
hw10.pdf、hw10-sol.pdf列出你的学习小组成员的姓名和 SID(学生编号)。如果你没有合作者,必须明确写出 "none"。
这是课程行政要求:只需如实填写即可。如果你独立完成,请明确写 "none",不要留空。
本地资料未提供这道题的官方解答;页面只保留题面与非答案式提示。
题面来源:hw10.pdf · 1 · confidence: high
居住在某国的 \(k\) 名秘密特工(secret agent)在紧急情况下需要逃生路线。他们将乘坐火车系统逃生,我们可以将其视为有向图 \(G = (V, E)\),其中 \(V\) 是城市,\(E\) 是铁路。每名秘密特工 \(i\) 有一个起点 \(s_i \in V\),且所有 \(s_i\) 互不相同。每名特工都需要到达友好国家的领事馆;这些领事馆位于已知的城市集合 \(T \subseteq V\) 中。为了不被发现,特工们约定:任何一个城市最多只能有 \(c\) 名特工经过。我们的目标是找出一组路径,为每名秘密特工各找一条(或检测要求无法满足)。
将该问题建模为一个流网络(flow network)。指明顶点、边和容量;证明你的网络中的最大流可以转化为原问题的最优解。你不需要解释如何求解最大流实例本身。
将每名特工视为一个单位的流,从 \(s_i\) 流向任意领事馆城市。关键难点在于对每个城市施加「最多 \(c\) 名特工经过」的顶点容量约束:这需要用「拆点」(vertex splitting)技巧把顶点容量转化为边容量。
我们可以将每名秘密特工 \(i\) 视为一个单位的流,希望把它从 \(s_i\) 移动到任意顶点 \(\in T\)。为此,我们将原图建模为流网络:
如果最大流确实为 \(k\),那么由于所有容量都是整数,计算最大流的 Ford-Fulkerson 算法将输出一个整数流(所有流量值均为整数的流)。因此,我们可以从每名秘密特工 \(i\) 出发,沿着流中从 \(s_i\) 到 \(T\) 中任意顶点的路径追踪。遍历所有特工即可得到一个解。
解答来源:hw10-sol.pdf · 1 · confidence: high
题面来源:hw10.pdf · 1 · confidence: high
你正在经营一家健身房,需要招聘教练。约束条件如下:
共有 \(D\) 天。
有 \(n\) 名教练可供聘用。第 \(i\) 名教练从第 \(a_i\) 天到第 \(b_i\) 天可供聘用。数字 \(\{a_i, b_i\}\)(\(i = 1 \dots n\))作为输入给出。
每名教练只能在其整个可用期间被聘用,即如果聘用第 \(i\) 名教练,则从第 \(a_i\) 天到第 \(b_i\) 天他每天都在健身房。
每天应该有恰好 \(k\) 名教练在健身房。
你的目标是确定聘用哪些教练以满足上述约束。设计一个高效算法,通过构造有向图 \(G\)(含源点 \(s\) 和汇点 \(t\))并计算从 \(s\) 到 \(t\) 的最大流来求解本题。不需要证明正确性。
考虑两种建图思路:一种是为每天建一个顶点,将教练看作覆盖连续时间段的边;另一种是为每名教练建一个顶点,通过边的连接表示时间上的衔接。注意 \(D\) 天只是参数而输入是 \(n\) 名教练的列表,因此基于 \(D\) 的建图可能是伪多项式时间。
解法一:使用 \(D + 2\) 个顶点。
算法描述:为每天 \(d = 1 \dots D\) 创建一个顶点。同时创建一个起点 \(s\) 和一个终点 \(t\),为方便起见分别将其索引设为 \(0\) 和 \(D + 1\)。
然后,对 \(u, v \in \{0, \dots, D\}\),如果存在某个教练从第 \(v+1\) 天到第 \(u\) 天可用,则创建一条边 \(u \to v\),并将其权重(容量)设为具有该可用范围的教练数量。注意我们为了计算目的将顶点 \(s\) 视为索引 \(0\)。此外,添加一条从顶点 \(D\) 到终点 \(t\) 的边,权重为 \(k\)。
检查是否存在有效调度的方法是检查从 \(s\) 到 \(t\) 的最大流是否等于 \(k\)。
解法二:使用 \(n + 2\) 个顶点。
算法描述:为每名教练 \(i = 1 \dots n\) 创建一个顶点,加上 \(s\) 和 \(t\)。然后,如果 \(a_j = b_i + 1\),则用单位容量边连接顶点 \(i\) 和 \(j\)。将所有满足 \(a_i = 0\) 的顶点连接到 \(s\),将所有满足 \(b_i = D\) 的顶点连接到 \(t\)。
正确性类似于 \(D+2\) 解:从 \(s\) 到 \(t\) 的路径对应于覆盖所有 \(D\) 天的教练序列。
注意:\(n+2\) 解优于 \(D+2\) 解,因为 \(D\) 只是作为参数给出(而我们给出的是 \(n\) 名教练的列表),所以 \(D+2\) 顶点解实际上是伪多项式时间。
解答来源:hw10-sol.pdf · 2 · confidence: high
题面来源:hw10.pdf · 2 · confidence: high
你和你的朋友以前玩石头剪刀布(rock-paper-scissors),输家付给赢家 1 美元。然而,你在 CS170 中学到最佳策略是均匀随机选择每种走法,这让游戏变得乏味。
你的朋友想让游戏重新变得有趣,建议玩以下变体:如果你用布(paper)赢石头(rock),你从对手那里得到 2 美元。如果你用石头(rock)赢剪刀(scissors),你得到 1 美元。如果你用剪刀(scissors)赢布(paper),你得到 4 美元。
你可以使用在线 LP 求解器来求解本题的线性规划。以下是一个可以使用的在线求解器示例:https://online-optimizer.appspot.com/。
(a) 画出该游戏的收益矩阵(payoff matrix)。假设你是最大化者(maximizer),你的朋友是最小化者(minimizer)。
(b) 写出从你的视角求最优策略的线性规划。
你的朋友现在想让游戏变得更加有趣,建议根据以下收益矩阵分配分数:
| 你 \ 你的朋友 | rock | paper | scissors |
|---|---|---|---|
| rock | -10 | 3 | 3 |
| paper | 4 | -1 | -3 |
| scissors | 6 | -9 | 2 |
(c) 写出为你自己求最优策略的线性规划。最优策略和期望收益是多少?
(d) 现在为你的朋友做同样的分析。最优策略和期望收益是多少?期望收益与 (c) 的答案相比如何?
| 你 \ 你的朋友 | rock | paper | scissors |
|---|---|---|---|
| rock | -10 | 3 | 3 |
| paper | 4 | -1 | -3 |
| scissors | 6 | -9 | 2 |
来源:hw10.pdf · 3
| 你 \ 你的朋友 | rock | paper | scissors |
|---|---|---|---|
| rock | 0 | -2 | 1 |
| paper | 2 | 0 | -4 |
| scissors | -1 | 4 | 0 |
来源:hw10-sol.pdf · 4
(a)(b) 注意零和博弈中收益矩阵的定义:矩阵中的值是从行玩家(你)角度出发的收益。对于 (c)(d),你可以通过对偶性将最小化者的 LP 转化为最大化者的 LP,或反之。
(a) 收益矩阵如下(你是行玩家):
| 你 \ 你的朋友 | rock | paper | scissors |
|---|---|---|---|
| rock | 0 | -2 | 1 |
| paper | 2 | 0 | -4 |
| scissors | -1 | 4 | 0 |
(b) 设 \(r, p, s\) 分别是你出 rock、paper、scissors 的概率。设 \(z\) 表示在对手也最优出牌时的期望收益。
\[ \begin{aligned} \max \quad & z \\ \text{s.t.} \quad & 2p - s \geq z && \text{(对手选择 rock)} \\ & 4s - 2r \geq z && \text{(对手选择 paper)} \\ & r - 4p \geq z && \text{(对手选择 scissors)} \\ & r + p + s = 1 \\ & r, p, s \geq 0 \end{aligned} \]
(c) 为你自己(最大化者)建立的 LP:
\[ \begin{aligned} \max \quad & z \\ \text{s.t.} \quad & -10r + 4p + 6s \geq z && \text{(对手选择 rock)} \\ & 3r - p - 9s \geq z && \text{(对手选择 paper)} \\ & 3r - 3p + 2s \geq z && \text{(对手选择 scissors)} \\ & r + p + s = 1 \\ & r, p, s \geq 0 \end{aligned} \]
最优策略为 \(r = 0.3346\),\(p = 0.5630\),\(s = 0.1024\),最优收益为 \(-0.48\)。
(d) 为你的朋友(最小化者)建立的 LP:
\[ \begin{aligned} \min \quad & z \\ \text{s.t.} \quad & -10r + 3p + 3s \leq z && \text{(你选择 rock)} \\ & 4r - p - 3s \leq z && \text{(你选择 paper)} \\ & 6r - 9p + 2s \leq z && \text{(你选择 scissors)} \\ & r + p + s = 1 \\ & r, p, s \geq 0 \end{aligned} \]
你朋友的最优策略为 \(r = 0.2677\),\(p = 0.3228\),\(s = 0.4094\)。该博弈值为 \(-0.48\),即你的收益。你朋友的收益为你的收益的相反数,即 \(0.48\),因为博弈是零和的。
(评分说明:等价的 LP 均可接受。(d) 部分最大化你朋友的收益而非最小化你的收益也可以。策略可以用分数或接近解的小数表示,只要 LP 正确即可。)
解答来源:hw10-sol.pdf · 4-6 · confidence: high
题面来源:hw10.pdf · 3 · confidence: high
在本题中,我们探讨一个称为被支配策略(dominated strategy)的概念。考虑一个零和博弈,其行玩家的收益矩阵如下:
| 行玩家 \ 列玩家 | A | B | C |
|---|---|---|---|
| D | 1 | 2 | -3 |
| E | 3 | 2 | -2 |
| F | -1 | -2 | 2 |
(a) 如果行玩家最优地进行游戏,你能否不直接求解最优策略,求出他们选择 D 的概率?证明你的答案。
提示:行玩家选择 D 的收益与选择 E 的收益相比如何?
(b) 根据 (a) 的答案,如果双方都最优地进行游戏,列玩家选择 A 的概率是多少?证明你的答案。
(c) 根据 (a) 和 (b) 的答案,双方的最优策略是什么?
注意:本题的所有部分都可以不使用 LP 求解器或求解线性方程组来解决。
| 行玩家 \ 列玩家 | A | B | C |
|---|---|---|---|
| D | 1 | 2 | -3 |
| E | 3 | 2 | -2 |
| F | -1 | -2 | 2 |
来源:hw10.pdf · 4
(a) 比较行 D 和行 E:无论列玩家选哪一列,行 E 的收益都不小于行 D,且至少有一列严格更大。这意味着任何给 D 赋予正概率的策略都可以通过将概率转移到 E 来改进。
(b) 在行玩家绝不选 D 的前提下,比较列 A 和列 B。
(a) 概率为 \(0\)。无论列玩家选择哪个选项,行玩家选择 E 总是比选择 D 获得更高的收益,因此任何涉及以非零概率选择 D 的策略都可以通过改为选择 E 来改进。
(b) 概率为 \(0\)。我们知道行玩家绝不会选择 D,即总是选择 E 或 F。但在这种情况下,列玩家选择 B 总是比选择 A 更好(只有当行玩家选择 D 时 A 才更好)。也就是说,在行玩家最优行事的前提下,B 支配 A。
(c) 基于前两部分,我们只需考虑行玩家选择 E 或 F、列玩家选择 B 或 C 的概率。查看对应这些选项的 \(2 \times 2\) 子矩阵,可以得出行玩家的最优策略是以 \(1/2\) 的概率选择 E 和 F,同理列玩家应以 \(1/2\) 的概率选择 B 和 C。
解答来源:hw10-sol.pdf · 7 · confidence: high
题面来源:hw10.pdf · 4 · confidence: high
回顾一下,顶点覆盖(vertex cover)是图中的一组顶点,使得每条边都至少与该组中的一个顶点相邻。
以下是顶点覆盖问题的三种形式化描述:
作为决策问题(decision problem):给定图 \(G\),如果它有大小至多为 \(b\) 的顶点覆盖,则返回 TRUE,否则返回 FALSE。
作为搜索问题(search problem):给定图 \(G\),找到大小至多为 \(b\) 的顶点覆盖(即返回实际的顶点),或报告不存在。
作为优化问题(optimization problem):给定图 \(G\),找到最小顶点覆盖。
乍看之下,搜索似乎比决策更难,而优化似乎更难。我们将证明,如果任何一个可以在多项式时间内解决,其他的也可以。
(a) 假设你有一个在多项式时间内解决顶点覆盖(决策)的黑盒。给出一个在多项式时间内解决顶点覆盖(搜索)的算法。
(b) 类似地,假设我们知道如何在多项式时间内解决顶点覆盖(搜索)。给出一个在多项式时间内解决顶点覆盖(优化)的算法。
(a) 决策黑盒只回答「是否存在」,你需要逐个测试顶点:删除一个顶点后询问剩余图是否存在大小为 \(b-1\) 的覆盖,从而判断该顶点是否属于某个最优覆盖。
(b) 最小顶点覆盖的大小有一个自然的上下界,可以在这个范围内进行二分搜索。
(a) 给定图 \(G\) 和预算 \(b\),我们首先对实例 \((G, b)\) 运行决策算法。如果它返回 "FALSE",则报告 "无解"。
如果返回 "TRUE",则存在解,我们按如下方式找到它:
任选一个节点 \(v \in G\) 并将其删除,同时删除任何关联的边。
对实例 \((G \setminus \{v\}, b-1)\) 运行决策;如果它说 "TRUE",则将 \(v\) 加入顶点覆盖。否则,将 \(v\) 及其边放回 \(G\)。
重复直到 \(G\) 为空。
正确性:如果没有解,我们显然报告无解。如果有解,则我们的算法测试各个节点,看它们是否属于某个大小为 \(b\) 的顶点覆盖(可能有多个)。当且仅当 \(v\) 属于某个这样的覆盖时,子图 \(G \setminus \{v\}\) 必须有一个大小不超过 \(b-1\) 的顶点覆盖。归纳地应用此论证。
运行时间:在找到一个属于 \(b\) 顶点覆盖的 \(v\) 并递归之前,我们可能测试每个顶点一次。因此我们调用决策过程 \(O(n^2)\) 次。这可以通过不重复考虑任何顶点来收紧到 \(O(n)\)。由于一次调用决策花费多项式时间,我们整体具有多项式复杂度。
注意:这种归约可以看作是一种贪心算法,在其中我们一次发现(或消除)一个顶点。
(b) 对顶点覆盖的大小 \(b\) 进行二分搜索。
正确性:该算法正确的原因与二分搜索相同。
运行时间:最小顶点覆盖的大小对于非空图至少为 \(1\),至多为 \(|V|\),因此搜索黑盒将被调用 \(O(\log |V|)\) 次,整体给出多项式复杂度。
最后,由于解决优化问题允许我们回答决策问题(想想为什么),我们看到所有三个问题都可以相互归约!
解答来源:hw10-sol.pdf · 8-9 · confidence: high
题面来源:hw10.pdf · 5 · confidence: high
顶点覆盖(Vertex Cover):给定无向无权图 \(G = (V, E)\),\(G\) 的顶点覆盖 \(C_V\) 是顶点的子集,使得对于每条边 \(e = (u, v) \in E\),\(u\) 或 \(v\) 中至少一个必须在顶点覆盖 \(C_V\) 中。
集合覆盖(Set Cover):给定元素的全集 \(U\) 和集合的收集 \(S = \{S_1, \dots, S_m\}\),集合覆盖是任何(子)集合的收集 \(C_S\),其并集等于 \(U\)。
在最小顶点覆盖问题中,给定无向无权图 \(G = (V, E)\),要求找到最小的顶点覆盖。例如,在下图中,\(\{A, E, C, D\}\) 是一个顶点覆盖,但不是最小顶点覆盖。最小顶点覆盖是 \(\{B, E, C\}\) 和 \(\{A, E, C\}\)。
(图:顶点 A、B、C、D 在上排,E、F 在下排,具体连接关系见原图)
回顾最小集合覆盖问题,给定集合 \(U\) 和 \(U\) 的子集收集 \(S_1, \dots, S_m\),要求找到最小的集合覆盖。例如,给定 \(U := \{a, b, c, d\}\),\(S_1 := \{a, b, c\}\),\(S_2 := \{b, c\}\),\(S_3 := \{c, d\}\),问题的一个解是 \(C_S = \{S_1, S_3\}\)。
给出从最小顶点覆盖问题到最小集合覆盖问题的高效归约。不需要证明正确性。
顶点:A, B, C, D, E, F 已知最小顶点覆盖:{B, E, C} 和 {A, E, C} 已知非最小顶点覆盖:{A, E, C, D} (具体边连接关系需参照原图)
来源:hw10.pdf · 6
考虑如何将图的边「编码」为集合覆盖中的元素,以及如何将顶点「编码」为集合,使得覆盖所有边等价于选出的集合的并集等于全集。
算法描述:设 \(G = (V, E)\) 为最小顶点覆盖(MVC)问题的一个实例。创建最小集合覆盖(MSC)问题的一个实例,其中 \(U = E\),且对每个 \(u \in V\),集合 \(S_u\) 包含所有与 \(u\) 关联的边。
设 \(C_S = \{S_{u_1}, S_{u_2}, \dots, S_{u_k}\}\) 是一个集合覆盖,其中 \(k = |C_S|\)。则我们对应的顶点覆盖为 \(C_V = \{u_1, u_2, \dots, u_k\}\)。
正确性:为了看出 \(C_V\) 是一个顶点覆盖,任取 \((u, v) \in E\)。由于 \((u, v) \in U\),存在某个集合 \(S_{u_i}\) 包含 \((u, v)\),所以 \(u_i\) 等于 \(u\) 或 \(v\),且 \((u, v)\) 在顶点覆盖中被覆盖。因此,\(G\) 中的每个顶点覆盖都对应 \(U, S\) 中的一个集合覆盖。
现在任取一个顶点覆盖 \(u_1, \dots, u_k\)。为了看出 \(S_{u_1}, \dots, S_{u_k}\) 是一个集合覆盖,任取 \((u, v) \in E\)。根据顶点覆盖的定义,存在某个 \(i\) 使得 \(u = u_i\) 或 \(v = u_i\)。所以 \((u, v) \in S_{u_i}\),因此 \(S_{u_1}, \dots, S_{u_k}\) 是一个集合覆盖。因此,\(U, S\) 中的每个集合覆盖都对应 \(G\) 中的一个顶点覆盖。
由于每个顶点覆盖都有对应的集合覆盖(反之亦然),且最小化集合覆盖就最小化了对应的顶点覆盖,该归约成立。
解答来源:hw10-sol.pdf · 10 · confidence: high
题面来源:hw10.pdf · 6 · confidence: high
在最大流问题中,我们只想看看在源点和汇点之间能发送多少流。但通常,我们希望建模这样一个事实:输送流需要花钱。更准确地说,给定有向图 \(G\),含源点 \(s\)、汇点 \(t\)、费用 \(\ell_e\)、容量 \(c_e\) 和流量值 \(F\)。我们希望找到最小成本的非负流 \(f\),即最小化 \(\sum_e \ell_e f_e\),满足容量约束并从 \(s\) 到 \(t\) 输送 \(F\) 单位的流。
(a) 证明最小费用流问题可以在多项式时间内解决。
(b) 描述从最短路问题到最小费用流的归约。不需要证明正确性。
(c) 描述从最大流问题到最小费用流的归约。不需要证明正确性。
(a) 将最小费用流写成线性规划形式:决策变量是各边上的流量 \(f_e\),约束包括容量限制和流量守恒。
(b) 考虑 \(F = 1\) 且所有容量为 1 的最小费用流实例,思考最小费用流的结构。
(a) 将最小费用流写成线性规划。一种形式化如下:
\[ \begin{aligned} \min \quad & \sum_e \ell_e f_e \\ \text{s.t.} \quad & 0 \leq f_e \leq c_e && \forall e \in E \\ & \sum_{e \text{ 进入 } v} f_e = \sum_{e \text{ 离开 } v} f_e && \forall v \in V, v \neq s, t \\ & F + \sum_{e \text{ 进入 } s} f_e = \sum_{e \text{ 离开 } s} f_e \end{aligned} \]
(b) 算法描述:考虑图 \(G\) 上的一个最短路实例,起点为 \(s\),终点为 \(t\),边权为 \(\ell_e\)。令 \(F = 1\) 且对所有边 \(e\) 令 \(c_e = 1\)。在最小费用流 \(f\) 中——由 \(G\) 中流量非零的边组成的子图 \(H\)——从 \(s\) 到 \(t\) 的所有有向路径的长度都等于从 \(s\) 到 \(t\) 的最短路的长度。因此,要在 \(H\) 中找到从 \(s\) 到 \(t\) 的最短路,只需使用 DFS 或 BFS 找到 \(H\) 中 \(s\) 到 \(t\) 的任意一条路径即可。
正确性证明(非必需):假设每个 \(\ell_e > 0\)(我们可以收缩任何 \(\ell_e = 0\) 的边)。首先,我们证明 \(H\) 是一个 DAG。如果 \(H\) 不是 DAG,则它必须包含一个环。设 \(\delta > 0\) 为该环上任意边上的最小流量。从该环上所有边的流量中减去 \(\delta\),结果得到一个仍然从 \(s\) 到 \(t\) 输送 1 单位流的流。然而,这个流的成本比之前更小,与 \(f\) 是最小费用流矛盾。因此,\(H\) 是一个 DAG。
考虑 \(H\) 中 \(s\) 到 \(t\) 的任意路径 \(P\)。设 \(\delta\) 为该路径上任意边上的最小流量。可以将流 \(f\) 写成包括 \(P\) 在内的路径的线性组合:
\[f = \delta p + \delta_1 q_1 + \dots + \delta_k q_k\]
其中 \(p\) 和 \(q_i\) 分别是沿路径 \(P\) 和 \(Q_i\) 的单位流,\(\delta_i\) 是从 \(P, Q_1, \dots, Q_{i-1}\) 中减去流量后某条任意路径 \(Q_i\) 上的最小流量。
由于减去 \(\delta_i\) 单位的流使从 \(s\) 到 \(t\) 的流减少了 \(\delta_i\) 单位,所以 \(\delta + \sum_i \delta_i = 1\)。
由于最小费用流的目标函数是线性的,我们可以写出:
\[ \sum_e \ell_e f_e = \delta \sum_e \ell_e p_e + \sum_i \delta_i \sum_e \ell_e q_{i,e} = \delta \sum_{e \in P} \ell_e + \sum_i \delta_i \sum_{e \in Q_i} \ell_e \]
特别地,流 \(f\) 的成本是根据权重 \(\delta, \delta_1, \dots, \delta_k\) 的路径 \(P, Q_1, \dots, Q_k\) 的平均长度。因此,如果 \(P\) 或某个 \(Q_i\) 不是从 \(s\) 到 \(t\) 的最短路,可以通过将该路径上的流重新分配到 \(s\) 到 \(t\) 的某条最短路来降低 \(f\) 的成本。这意味着如果 \(f\) 具有最小成本,\(P\) 和所有 \(Q_i\) 都必须是 \(s\) 到 \(t\) 的最短路。由于 \(P\) 被选为 \(H\) 中从 \(s\) 到 \(t\) 的任意路径,\(H\) 中的所有路径都必须是 \(s\) 到 \(t\) 的最短路。
(c) 我们可以使用二分搜索来找到真正的最大流值。考虑图 \(G\) 上的一个最大流实例,容量为 \(c_e\),我们希望从 \(s\) 到 \(t\) 输送流。按如下方式创建最小费用流实例。将容量设为等于 \(c_e\),并让长度任意(例如对所有边 \(\ell_e = 1\))。我们知道最大流值 \(F_{\max} \leq \sum_e c_e\)。
如果容量是整数,\(F_{\max}\) 也是整数。因此,我们可以二分搜索来找到它的真实值。对于任意 \(F\),我们可以通过以至少 \(F\) 的值查询最小费用流实例来了解是否存在输送超过 \(F\) 单位流的流。如果存在值至少为 \(F\) 的流,它将返回一个有限成本的流。否则,程序不可行。
解答来源:hw10-sol.pdf · 11-12 · confidence: high
题面来源:hw10.pdf · 7 · confidence: high
hw10.pdfhw10-sol.pdf