P3347 [ZJOI2015] 醉熏熏的幻想乡
很魔怔的题解,突发奇想胡出来的很有可能错误的严格证明。
第一问直接求解如下的最大流建模即可:
- 对每个酿酒点 \(i\) 连边 \((S, i, c_i)\)。
- 对每条酿酒点 \(i\) 到存酒点 \(j\) 的通道连边 \((i, j + n, +\infty)\)。
- 对每个存酒点 \(j\) 连边 \((j + n, T, d_j)\)。
第二问乍一看上去就是边 \((S, i, c_i)\) 加上费用,再求解最小费用最大流即可。但实际上边的费用关于流量 \(x\) 呈二次函数 \(h_i(x) = a_ix^2 + b_ix\) 而非线性关系,因此无法直接使用费用流的 SSP 算法。
考虑借助极限的思想,设有实数 \(t > 0\),可以在如下最小费用最大流建模中、以 \(t\) 作为单位流量运行 SSP 算法求出每条边的流量均为 \(t\) 的非负整数倍时的最小费用 \(g(t)\):
- 对每个酿酒点 \(i\) 连边 \((S, i, t, h_i(t)), (S, i, t, h_i(2t) - h_i(t)), \dots, (S, i, t, h_i(\lfloor \frac{c_i}{t} \rfloor t) - h_i((\lfloor \frac{c_i}{t} \rfloor - 1)t))\)。
- 对每条酿酒点 \(i\) 到存酒点 \(j\) 的通道连边 \((i, j + n, +\infty, 0)\)。
- 对每个存酒点 \(j\) 连边 \((j + n, T, \lfloor \frac{d_j}{t} \rfloor t, 0)\)。
上述拆边的正确性在于:由 \(a_i \ge 0\) 有 \(h_i(x)\) 下凸,故 \(h_i((k + 1)t) - h_i(kt) \ge h_i(kt) - h_i((k - 1)t)\)。
我们有第二问答案为 \(\lim\limits_{t \to 0 + 0} g(t)\)。
这是因为固定 \(t\) 时,若在最优解中边 \((i, j + n, +\infty)\) 的流量为 \(x\),将其改为 \(\lfloor \frac{x}{t} \rfloor t\),同时调整其他类边的流量以满足流量平衡。
由 \(h_i^{\prime}(x)\) 一致有界,所有边 \((S, i, c_i)\) 上的 \(\Delta{总费用} = O(\Delta{总流量})\)。故进行上述更改后后总费用变化了 \(O(t)\),再将其任意增广至“每条边的流量均为 \(t\) 的非负整数倍”时的最大流后总费用也变化 \(O(t)\)。这意味着第二问答案和 \(g(t)\) 的一个上界相差 \(O(t)\)。
同理将 \(g(t)\) 对应的方案任意增广至真正的最大流,费用只会变化 \(O(t)\)。这意味着 \(g(t)\) 和第二问答案的一个上界相差 \(O(t)\)。
综上第二问答案和 \(g(t)\) 相差 \(O(t)\),因此第二问答案为 \(\lim\limits_{t \to 0 + 0} g(t)\)。
在上述费用流建模中运行 SSP 算法,相当于把形如 \((S, i, t)\) 的边按照费用从小到大依次加入尝试增广。
这个过程可以画出一个流量-费用的函数 \(f_t(x)\)。具体地,\(f_t(x)\) 表示加入所有费用 \(\le xt\) 的边后的最大流。
不难发现 \(f_t(x)\) 是过原点的单调递增函数。同时,固定常数 \(N\) 满足对 \(\forall i, x\) 有 \(h_i^{\prime}(x) \le N\),则 \(f_t(N) = \max\limits_{x \ge 0} f_t(x)\)。
SSP 算法求出的最小费用即为 \(f_t(x)\) 与 \(y\) 轴正半轴围成的区域面积,形式化地即 \(g(t) = Nf_t(N) - \int_0^N f_t(x) \mathrm{d}x\)。
记 \(f(x) = \lim\limits_{t \to 0 + 0} f_t(x)\),不难发现 \(f(x)\) 存在,且恰为将第一问的建模中 \((S, i, c_i)\) 改为 \((S, i, \min\{\frac{x - b_i}{2a_i}, c_i\})\) 后的最大流。
\(f_t(x)\) 即为将第一问的建模中 \((S, i, c_i)\) 改为 \((S, i, \min\{\max\{k \in \mathbb{N} \mid h_i(kt) - h_i((k - 1)t) \le xt\}, \lfloor \frac{c_i}{t} \rfloor\} t)\) 后的最大流。
由 \(a_i \ge 0\),若 \(h_i^{\prime}(kt) \le x\) 则 \(h_i(kt) - h_i((k - 1)t) = h_i^{\prime}(\xi)t \le h_i^{\prime}(kt)t \le xt\),同理若 \(h_i^{\prime}((k - 1)t) > x\) 则 \(h_i(kt) - h_i((k - 1)t) = h_i^{\prime}(\xi)t \ge h_i^{\prime}((k - 1)t)t > xt\),其中 \(\xi \in ((k - 1)t, kt)\)。
注意到 \(h_i^{\prime}(y) \le x \Leftrightarrow y \le \frac{x - b_i}{2a_i}\)。因此,\(f_t(x)\) 对应的建模中边 \((S, i)\) 的流量和 \(\min\{\frac{x - b_i}{2a_i}, c_i\}\) 相差 \(\le t\),即 \(|f_t(x) - f(x)| = O(t)\),故 \(f(x) = \lim\limits_{t \to 0 + 0} f_t(x)\)。
同时由上述证明过程中的 \(O(t)\) 所带常数与 \(x\) 无关,进一步地有 \(f_t(x) \rightrightarrows f(x)\)。
综上有第二问答案为:
其中由常数 \(N\) 的定义有 \(f(N)\) 为第一问答案,同时也为过原点的单调递增函数 \(f(x)\) 的最大值。因此第二问答案的几何意义即为 \(f(x)\) 与 \(y\) 轴正半轴围成的区域面积。
现在我们只需要考察 \(f(x)\),鉴于 \(f(x)\) 是用最大流定义的,我们不妨转而用最小割的角度考虑它。
对每个固定的割,由边 \((S, i)\) 的容量关于 \(x\) 是 \(O(1)\) 段折线组成的上凸函数,因此割的大小关于 \(x\) 是由 \(O(n)\) 段折线组成的上凸函数。
\(f(x)\) 相当于每个割对应的函数在 \(x\) 处的最小值,又因为 \(a_i \in \{0, 1, 2, 3\}\) 故所有可能出现的折线斜率只有 \(O(n)\) 种,进而 \(f(x)\) 也为由 \(O(n)\) 段折线组成的上凸函数。
对于一个固定的 \(x\),求出最大流后任求一个最小割就求出了过 \((x, f(x))\) 的一条切线斜率,因此可以通过分治用 \(O(n)\) 次网络流求出 \(f(x)\) 由哪些折线组成,进而求出第二问答案。
具体地,假设我们知道 \((l, f(l)), (r, f(r))\) 以及过这两点的切线,若这两条切线重合则横坐标区间 \([l, r]\) 中只有一条折线,否则记这两条切线的交点为 \((p, q)\)。若 \(q = f(p)\) 则横坐标区间 \([l, r]\) 中只有这两条折线,否则递归到 \((l, f(l)), (p, f(p))\) 和 \((p, f(p)), (r, f(r))\) 两个子问题。
时间复杂度为 \(O(n)\) 次 Dinic。

浙公网安备 33010602011771号