AOJ2168:Luigi's Tavern

問題. Luigi's Tavern

 H 人の勇者, W 人の戦士, C 人の聖職者と  M 人の魔術師がいる.次を満たすパーティを最大いくつ作ることができるかを求めよ.ただし,友達の制約は入力として与えられる.
 ・どのパーティにも勇者がいる
 ・パーティ内の勇者と戦士は友達
 ・パーティ内の戦士と聖職者は友達
 ・パーティ内の聖職者と魔術師は友達
 ・戦士,聖職者または魔術師がいないパーティ数がそれぞれ  N_W, N_C, N_M 以下
 ・聖職者がいないパーティには必ず戦士と魔術師がいる

制約 0 \le H, W, C, M, N_W, N_C, N_M \le 50

解法. 最大流問題

次の図のようにネットワークを構成して最大流問題に帰着します.青色,緑色,オレンジ色と赤色の四角はそれぞれ勇者,戦士,聖職者と魔術師を表しています.矢印は弧を表し各弧の容量は  N_W, N_C, N_M 以外すべて1です.また,色の付いた矢印は友達同士を結ぶ弧です.このとき  s, t - 最大流が求める答えとなります.
気持ちとしては,2つの役職でのパーティへの割り当てを二部グラフの最大マッチングとして解くということを,多段的に行っていくという感じです.また,◯◯という役職がいないパーティというのは,「◯◯という役職がいない」という人を仮想的に選ぶということに対応しています.なので,四角をそれぞれ  N_W, N_C, N_M 個ずつ設置することもできますが,最大流問題では1つの頂点に置き換えることができ,また,そのようにすることで計算時間が短くなります.
f:id:tatanaideyo:20190106175913p:plain:w300

計算時間 O(m n^2)  n = O(H + W + C + M) m = O(HW + WC + CM)

巨人の肩の上に立つような問題