CF708D Incorrect Flow
巧妙建模题。
题意:给定一张网络和一个流,但流不一定正确。可以花费 \(1\) 的代价,使某条边容量 \(\pm 1\),或者使某条边流量 \(\pm 1\)。问最小代价使流正确。
题面非常漂亮。而且网络流的问题也是用网络流解。
考虑一条边,初始容量 \(c\),初始流量 \(f\)。设它最终流量 \(f'\)。
注意到如果 \(f'\in [0,c]\),只需要更改 \(f\),代价 \(1\);如果 \(f'>c\),相当于要连带着 \(c\) 一起增加,代价 \(2\)。
把 \(f\le c\) 和 \(f>c\) 的边分开考虑。
-
\(f\le c\) 的边。记两端是 \(u\rightarrow v\)。
如果 \(f'\) 减小了,相当于退流,于是连边 \((v,u,f,1)\)。
如果 \(f\le f'\le c\),相当于在合法范围内增大流,于是连边 \((u,v,c-f,1)\)。
如果 \(f'>c\),\(f,c\) 就要一起增加,于是连边 \((u,v,+\infty,2)\)。
-
\(f>c\) 的边。记两端是 \(u\rightarrow v\)。
因为要保证最终流量 \(\le\) 容量,一开始直接让 \(f'\) 退掉 \(f-c\) 的流量。将 \(f-c\) 累加进答案里。
如果 \(c<f'\le f\),相当于一开始不让 \(f\) 减小到 \(c\),而是减小到最终的 \(f'\);而是让 \(c\) 增加。一来一去费用就抵消了,于是连边 \((v,u,f-c,0)\)。
如果 \(f'\le c\),就是一开始减小后继续减小。于是连边 \((v,u,c,1)\)。
如果 \(f'>f\),连边 \((u,v,+\infty,2)\)。
最小费用可行流。