「codeforces - 1307G」Cow and Exercise

link。


还是得加上一个前排提醒:前方公式密集,请小心谨慎处理。

推式子还是得自己手推才有意义,给出的过程更多只是用作参照检验。


我觉得原来那种推导太生硬了,尝试更新一个平凡(或许?)的推导。

考虑利用线性规划的对偶建模。最短路本身就是经典的线性规划,用三角不等式 \(d_v \geq d_u + w(u, v)\) 可以列出如下式子:

\[\begin{aligned} \mathrm{maximize} && d_n - d_1 & \\ \mathrm{s.t.} && d_v - d_u - a_{u, v} & \leq w(u, v) && (u, v)\in E \\ && \sum_{(u, v)\in E}a_{u, v} & \leq x \\ && d_i, a_{u, v} & \geq 0 \end{aligned} \]

虽然可以添上 \(d_1 = 0\),不过这样就不对称了,所以没有这么做(或许也可以推,可以自行尝试)。

直接将其上式对偶:

\[\begin{aligned} \mathrm{minimize} && \sum_{(u, v)\in E}w(u, v)\times f_{u, v} + x\times g & \\ \mathrm{s.t.} && \sum_{(p, u)\in E}f_{p, u} - \sum_{(u, p)\in E}f_{u, p} & \geq 0 && 1 < u < n \\ && \sum_{(p, 1)\in E}f_{p, 1} - \sum_{(1, p)\in E}f_{1, p} & \geq -1 \\ && \sum_{(p, n)\in E}f_{p, n} - \sum_{(n, p)\in E}f_{n, p} & \geq 1 \\ && g - f_{u, v} & \geq 0 && (u, v)\in E \\ && f_{u, v}, g & \geq 0 \end{aligned} \]

注意到 \(1, n\) 对应的不等式长得和其他不一样,考虑变形。只需引入变量 \(f_{n, 1} = 1\) 即可:

\[\begin{aligned} \mathrm{minimize} && \sum_{(u, v)\in E}w(u, v)\times f_{u, v} + x\times g & \\ \mathrm{s.t.} && \sum_{(p, u)\in E'}f_{p, u} - \sum_{(u, p)\in E'}f_{u, p} & \geq 0\\ && g - f_{u, v} & \geq 0 && (u, v)\in E \\ && f_{n, 1} & = 1 \\ && f_{u, v}, g & \geq 0 \end{aligned} \]

考虑所有 \(n\)\(\sum_{(p, u)\in E'}f_{p, u} - \sum_{(u, p)\in E'}f_{u, p} \geq 0\) 形式的不等式。

由于每条边恰好在其中出现 \(\pm 1\) 各一次,因此不等式左边相加等于零。

这可以推出 \(\sum_{(p, u)\in E'}f_{p, u} - \sum_{(u, p)\in E'}f_{u, p} = 0\)(想一想,为什么?)

现在我们冷静下来,分析这个式子和费用流的关系。

\(\sum_{(p, u)\in E'}f_{p, u} - \sum_{(u, p)\in E'}f_{u, p} = 0\) 对应流量平衡,\(f_{n, 1} = 1\) 规定了总流量为 1。

代价 \(\sum_{(u, v)\in E}w(u, v)\times f_{u, v}\) 即正常费用流的代价。

不过多出来的这个 \(g\) 有些令人困惑。\(g \geq f_{u, v}\) 像是容量,然而代价中又有 \(x\times g\) 这样的项。

考虑作变换 \(f'_{u, v} = f_{u, v} / g\),将容量固定下来。于是可以得到如下的最终结果:

\[\begin{aligned} \mathrm{minimize} && (\sum_{(u, v)\in E}w(u, v)\times f'_{u, v} + x)\times g &\\ \mathrm{s.t.} && \sum_{(p, u)\in E'}f'_{p, u} &= \sum_{(u, p)\in E'}f'_{u, p} \\ && f'_{u, v} & \leq 1 && (u, v)\in E \\ && f'_{n, 1} & = 1 / g \\ && f'_{u, v}, g & \geq 0 \end{aligned} \]

设流量 \(flow = 1 / g\),费用 \(cost = \sum_{(u, v)\in E}w(u, v)\times f'_{u, v}\),最终答案为 \(\frac{cost + x}{flow}\)

由于只会有 \(O(n)\) 种流量,直接求出所有可能,暴力回答询问。

当然,冷静分析一下发现只需要 \((flow, cost)\) 构成的凸包,询问可以二分。


如果你不太懂最短路还有三角不等式,这里提供另一种思路。

\(PATH\) 表示所有 \(1\)\(n\) 路径的集合,我们需要取这些路径长度最小值,并最大化它。

最小值最大看起来很怪,不过你可以这么写线性规划:

\[\begin{aligned} \mathrm{maximize} && D & \\ \mathrm{s.t.} && D - \sum_{(u, v)\in E} a_{u, v} & \leq \sum_{(u, v)\in E} w(u, v) && L\in PATH \\ && \sum_{(u, v)\in E}a_{u, v} & \leq x \\ && D, a_{u, v} & \geq 0 \end{aligned} \]

容易发现它确实做到了 “最小值最大”。

对偶:

\[\begin{aligned} \mathrm{minimize} && \sum_{L\in PATH}\left(\sum_{(u, v)\in E} w(u, v)\right)\times X_L + x\times Y &\\ \mathrm{s.t.} && Y - \sum_{(u, v)\in L}X_L & \geq 0 && (u, v)\in E \\ && \sum_{L\in PATH} X_L & \geq 1 \\ && X_L, Y & \geq 0 \end{aligned} \]

做一个类似的变换 \(X'_L = X_L / Y\),最后得到的结果大概是 “选出若干条路径,使得每条边最多被一条路径经过”,后面的过程类似。


最后,线性规划对偶建模本身只是分析问题的一种手段,也即你可以不懂对偶,纯贪心得到相同的结果。

然而列线性规划可以不动脑子,这是好的。

posted @ 2020-06-17 20:31  Tiw_Air_OAO  阅读(473)  评论(0编辑  收藏  举报