[问题思考]当网络流构图遇到负容量边时......

壹、问题描述

对于网络流,我们时刻会建出这样的边 —— 容量是负数,但是遇到这种情况不要放弃,其实是有补救措施的,这里有一个十分真实的案例:

原思路来源于 我的 [BZOJ3218]a+b Problem 的思路(推荐先去看一看题):

考虑正难则反,如果一个点是奇怪的,那么它的贡献就是 \(b_i-p_i\),反之,如果它不是奇怪的,就是 \(b_i\) 了,如果要求一个点不是 "奇怪" 的,那么就要求所有满足 \(1\le j<i,l_i\le a_j\le r_i\) 的点都是黑色,也就是说如果这些点都是黑色,就会有额外的贡献。

这就和文理分科十分像了,考虑源点黑,汇点白,划分两个点集,首先从 \(s\) 向每个点连接 \(b_i-p_i\) 的边,意味着选择黑色,然后从每个点向汇点连接 \(w_i\) 的边,意味着选择白色,考虑都是黑色的,就建虚点,对于每个虚点,从源点连接一条边权为对应格子的 \(p_i\),然后从这个虚点向每个满足条件的格子连接一个 \(+\infty\),然后直接跑最大流求最小割,最后的答案就是所有的点减去最小割。

对于我的这个思路,其实理论上来说是可行,但是对于建一条容量为 \(b_i-p_i\) 的边,可能会出现负容量,这个怎么解决呢?我们不妨将上图中,每条边的容量设为未知数,然后使用待定系数解出每条边应该赋多少。

贰、解决方案

对于以上思路,我们假设 \(s,t\) 为源汇点,对于主点我们设为 \(a\),其虚点为 \(a'\),和它有关联的点(即原题中满足那俩不等式的点)设为 \(b_1,b_2\),这个图就是

graph LR s((s)) t((t)) a((a)) a'((a')) b1((b1)) b2((b2)) subgraph main s-->|id=1/x|a a-->|id=2/y|t s-->|id=3/z|a' a'-->|inf|a end a'-->|inf|b1 a'-->|inf|b2 b1-->|...|t b2-->|...|t s-->|...|b1 s-->|...|b2

我们只考虑主点的情形(即图中黄色部分),所以 \(b_1,b_2\) 以及其虚点的情况我们都不考虑。

我们再假设 \(T\) 是我们一开始求得的一些值,最后用 \(T\) 减去割掉的边才是我们的真实贡献,我们可以考虑三种情形:

  1. \(a\) 属于黑色集 \(s\),而 \(b_1,b_2\) 只要有一个是白色,那么真实贡献是 \(b_a-p_a\),而我们割掉的边是 \(2,3\) 号;
  2. \(a\) 属于黑色集,同时 \(b_1,b_2\) 都是黑色集,那么 \(a\) 的真实贡献是 \(b_a\),同时这种情况下我们割掉 \(2\) 号边;
  3. \(a\) 属于白色集,这样可以不管 \(b_1,b_2\) 的状态,\(a\) 的真实贡献是 \(w_a\),这种情况下我们割掉 \(1,3\) 号边;

我们建立三个等式,等式建立遵循 "真实贡献=T-割边总值",那么三个等式就是

\[\begin{cases} b_a-p_a=T-y-z \\ b_a=T-y \\ w_a=T-x-z \end{cases} \]

然后,我们可以得到

\[\begin{cases} z=p_a \\ y=w_a+x+p_a-b_a \end{cases} \]

说明 \(z\) 是一个定值,而 \(y,x\) 之间有一个固定的差值,而我们只需要调整 \(x\) 的大小,让 \(y,x\) 同时为正数就可以了

显然,对于原本的思路,我们是将 \(x\) 赋值为了 \(b_a-p_a\),这样 \(y\) 的值才是 \(w_a\),但是这样赋值的话,\(x\) 可能是负数,所以我们考虑一种新的赋值方式:

\[x=b_a\Rightarrow y=w_a+p_a \]

这样,\(x,y\) 都是正数了,而我们的 \(T\) 又是什么?将 \(x\) (或者 \(y\))带入关于 \(x,T\) 的方程即可,此时有

\[T=b_a+y=w_a+b_a+p_a \]

所以我们最后的解决方案就是:

\(s\) 向每个点连接 \(b_i\) (就是 \(x\))的边,然后从每个点向汇点连接 \(w_i+p_i\) (就是 \(y\))的边,对于每个虚点,从源点连接一条边权为对应格子的 \(p_i\)(就是 \(z\)),然后从这个虚点向每个满足条件的格子连接一个 \(+\infty\),然后直接跑最大流求最小割,最后的答案就是所有点的 \(w_i+b_i+p_i\)(就是 \(T\))减去这个图上的最小割。

posted @ 2021-02-06 21:40  Arextre  阅读(310)  评论(0编辑  收藏  举报