2019年10月16日水曜日

Maximum-Cup 2013 F - 3人の騎士と1匹の犬

Maximum-Cup 2013 F - 3人の騎士と1匹の犬

魔力00の保有者はいかなる場合も不要なので最初に取り除き、MM11以上の魔力の保有者の総数としておく。

NMN \ge Mのケースは簡単で、マンハッタン距離をコストにして、MM個の騎士・魔力保有者のペアを作る最小重みマッチングを求めればよい。

N<MN < Mのケースが難しかった。魔力保有者をあらかじめ魔力の降順にソートしておいて、上位NN人の魔力保有者とのマッチングを考えればよいのだけれど、MAGICN\operatorname{MAGIC}_Nとちょうど同じ魔力を持つ者が複数人いたときに誰を選ぶかが問題になる。端的には、次のようにすればよい: (s,ts, tをフローの始点、終点とする)

  • ssから各騎士に、容量11、コスト00の辺を張る。
  • 各魔力保有者からttに、容量11、コスト00の辺を張る。
  • 各騎士からMAGICN\operatorname{MAGIC}_Nより大きな魔力の保有者に、容量11、コストがマンハッタン距離20000-20000の辺を張る。
  • 各騎士からちょうどMAGICN\operatorname{MAGIC}_Nの魔力の保有者に、容量11、コストがマンハッタン距離の辺を張る。

MAGICN\operatorname{MAGIC}_Nより大きな魔力の保有者が必ずマッチングに含まれるようにしたいので、20000-20000の補正を入れている。あとは流量NNの最小コストを求めて、20000×MAGICN20000 \times \operatorname{MAGIC}_Nより大きな魔力の保有者の数を足して戻せば答えになっている。