【模板】最大权闭合子图
网络流模型#1
前置芝士:最小割。
1. 闭合子图:
定义一个有向图 \(G(V,E)\) 的闭合子图是 \(G\) 的一个点集,且该点集的所有出边都还指向该点集。即闭合图内的任意点的任意后继也一定在闭合图中。
形式化的,闭合子图是这样一个点集 \(V'\),对于 \(\forall (u,v)\in E\),若\(u \in V'\),则 \(v \in V'\)。
注意:空集也是一个闭合子图。
2. 最大权闭合子图
现在我们给每一个点 \(v\) 赋一个点权 \(w_v\in (-\infty ,+\infty)\)。于是每个闭合子图就有了一个权值。
顾名思义,最大权闭合子图就是这些子图中权值最大的。
但是这个东西怎么求呢?
3.构造
我们发现它现在和网络流一点关系都没有,于是把这张图转化一下。
首先建一个源点 \(s\) 和汇点 \(t\)。
然后我们让 \(s\) 对每个 \(v \in V^+\)(就是正权点)建一条边\((s,v,w_v)\),让每个 \(v\in V^-\)(负权点)对 \(t\) 建一条边\((v,t,-w_v)\)。然后对于原图中的\((u,v) \in E\) 建一条边\((u,v,+\infty)\)(第三个数表示的是这条边的容量)。
然后我们能证明我们要求的最大权闭合子图的值就是原图中的正权和-新图的最大流(最小割)。
接下来开始证明。
4.证明
首先由于最小割等于最大流(证明略),而且最大流显然不会是\(+ \infty\),所以那些容量是\(+ \infty\) 的边一定不会被算进去。
于是每张闭合子图都能和一个割一一对应。
设当前我们考虑闭合子图 \(V_1\),设 \(V_1\) 在 \(V\) 中的补集为 \(V_2\),即 \(V_2=V-V_1\)。
然后 \(V_1\) 所对应的割就是 \([V_1\cup\{s\},V_2\cup\{t\}]\)。
定义 \(V^+\) 为原图 \(G\) 中权值为正数的点集,\(V^-\) 为原图 \(G\) 中权值为负数的点集。
相应的,我们可以定义 \(V_1^+,V_1^-,V_2^+,V_2^-\)。
接下来我们要证明这样一个东西:
对任意闭合子图 \(V_1\) 所对应的割 \([S,T]\),有 \(c[S,T]=\sum_{v \in V_2^+}(w_v)+\sum_{v \in V_1^-}(-w_v)\)。
说人话:每个割的容量等于当前没选的正权和-当前选了的负权和。
为什么呢?
因为 \([S,T]\) 是 \(V_1\) 所对应的割,所以 \([S,T]\) 即为\([V_1\cup\{s\},V_2\cup\{t\}]\)。
于是我们可以把割 \([S,T]\) 等效的看成 \([V_1,V_2]\cup[V_1,\{t\}]\cup[\{s\},V_2]\cup[\{s\},\{t\}]\)。
然后很明显因为割集中不能有容量为 \(+\infty\) 的边,所以 \([V_1,V_2]=\varnothing\)。
又因为我们构造的时候 \(s\) 和 \(t\) 不可能有直接的边相连,所以 \([\{s\},\{t\}]\) 也是 \(\varnothing\)。
于是 \([S,T]=[\{s\},V_2]\cup[V_1,\{t\}]\)。
因为 \(s\) 只和正权点有边,所以 \([\{s\},V_2]=[\{s\},V_2^+]\)。
又因为 \(t\) 只和负权点有边,所以 \([V_1,\{t\}]=[V_1^-,\{t\}]\)。
于是\([S,T]=[\{s\},V_2^+]\cup[V_1^-,\{t\}]\)。
所以 \(c[S,T]=\sum_{v \in V_2^+}(w_v)+\sum_{v \in V_1^-}(-w_v)\)。
我们再设闭合子图 \(V_1\) 的权值为 \(w(V_1)\)。
根据定义,\(w(V_1)=\sum_{v \in V_1^+}(w_v)-\sum_{v \in V_1^-}(-w_v)\)。
然后我们把上面两个等式加起来可以得到:
\(\begin{aligned} c[S,T]+w(V_1)&=\sum_{v \in V_2^+}(w_v)+\sum_{v \in V_1^-}(-w_v)+\sum_{v \in V_1^+}(w_v)-\sum_{v \in V_1^-}(-w_v) \\&=\sum_{v \in V_2^+}(w_v)+\sum_{v \in V_1^+}(w_v) \\&=\sum_{v \in V^+}(w_v)\end{aligned}\)
然后移一移项,得到:
然后我们要最大化 \(w(V_1)\),而 \(\sum_{v \in V^+}(w_v)\)表示原图中的正权和,是个常数。
于是我们只要最小化 \(c[S,T]\) 就行了。
然后就是上面的结论:最大权闭合子图的值=原图中的正权和-新图的最大流(最小割)
撒花。