网络流的一类经典模型。
给出一张有向图 G = ( V , E ) G=(V,E) G=(V,E),你要选定一个点集 A A A,对于任意 x ∈ A x\in A x∈A,若存在 ( x , y ) ∈ E (x,y)\in E (x,y)∈E,那么一定有 y ∈ A y\in A y∈A,你要使 A A A 中的点权值和最大。
先将点分为两类,正权点和负权点。
考虑如何构建网络,建立超级源 S S S 和超级汇 T T T,令 S S S 向正权点连边,流量为权值,负权点向 T T T 连边,流量为权值的相反数。对于原图中的边 ( x , y ) (x,y) (x,y),我们也建出来,流量为 ∞ \infty ∞。
那么跑完网络流之后,这张图会分成两份,一份是和源点 S S S 连着的,一份是和汇点 T T T 连着的。显然,和源点连着的,就是一个闭合子图,因为中间的边流量无穷大,不可能被割掉,所以与 S S S 连着的实验的后继都在这个图中。
那么考虑计算与 S S S 相连的这张子图的收益。
先放一张图,表示跑完网络流后的图(很丑,轻喷QAQ):
就像这样分成两块,
S
S
S 中有正点也有负点,那么收益就是正点的权值和
减负点的权值和
。
发现这两个东西都不好求,于是转化一下。
先列一下我们有的量:
- 这张图的割是 T 正 + S 负 T_正+S_负 T正+S负
- 这张图的所有正点的权值和(显然可以预处理),即 S 正 + T 正 S_正+T_正 S正+T正
而我们现在需要求: S 正 − S 负 S_正-S_负 S正−S负。
显然,用正点的权值和减去割就是我们要的答案。
但现在还有一个要求,我们要收益尽可能大,也就是
S
正
−
S
负
S_正-S_负
S正−S负 尽可能大,也就是正点的权值和减去割
尽可能大。
发现正点的权值和是固定的,那我们只需要求一个尽可能小的割,根据最大流最小割定理,我们只需要求出这张图的最大流就好了。