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\) 的边分开考虑。

  1. \(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)\)

  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)\)

最小费用可行流。

posted @ 2024-06-12 19:23  FLY_lai  阅读(6)  评论(0编辑  收藏  举报