beet's soil

知見を共有

View the Project on GitHub beet-aizu/blog

最小費用流の双対

主問題

$l,u,g,w$ が与えられたり与えられなかったりしたとき($l, g$ は与えられなくても $0$ にしてしまえる)、以下の形の問題を最小費用流に帰着できる:

$ \displaystyle \max_{0 \le a,b,p} \sum_e l_e a_e - \sum_e u_e b_e - \sum_v g_v p_v $

s.t.

イメージ的には

いずれも非負である必要があることに注意

また、式からもわかるように $ l, u, g $ は目的関数における $ a, b, p $ の係数である

双対問題

双対問題として対応する最小費用流のLPは以下のように定式化される:

$ \displaystyle \min_{0 \le f} \sum_e w_e f_e $

s.t.

制約の上二つの式をまとめて書くと、$ l_e \le f_e \le u_e $ となる

つまり、$l$ が最小流量制約を、$ u $ が最大流量制約を表す

また、$ g_v $ はその頂点からどれだけフローが湧き出るかを表す

頂点 $ v$ は、$ g_v > 0 $ のときソースに、$ g_v < 0 $ のときシンクになる

したがって、超頂点 $S, T $ を導入し、以下のようにグラフを構築することで主問題の最適解を得られる

実装例

$V$ : 頂点数、$E$ : 辺数、$F$ : 全体の流量、 $U$ : 辺一本あたりの流量の上界、$C$ : 辺一本あたりのコストの上界 として

その他

そもそもどんな問題が解けるのかや、二変数の差に関するテクニックは 双対性 が詳しい

また、この記事は主に 競プロとLP双対まわりの話で最近知ったこと を参考にした

Back to top page
Google アナリティクスを使用しています (詳しくは こちら