geam1113’s diary

主にAtcoderのコンテストの備忘録を書きます。AtCoder緑と水色を行ったり来たりしています。

牛ゲー

2022/01/15 修正 ・有向グラフの図追加

初めに

AtCoderの問題で牛ゲーが出たので、まとめておきます。数学的に厳密でない部分や、誤りを含む場合もありますのでご了承ください。

牛ゲーとは

以下の2つの問題があります。


d_{v_i} - d_{u_i} \leq w_i\\
d_{v_{i+1}} - d_{u_{i+1}} \leq w_{i+1}\\
\cdots \\ 
d_{v_M} - d_{u_M} \leq w_M 

という「2つの値の差分についての制約」のみからなる制約の元で、d_sと各d_{v_i}の差d_{v_i} - d_sを最大化する線形計画問題
重みつき有向グラフG=(V,E)について、頂点uから頂点vにコストwの有向辺があることをe=(u,v,w)と表現する。


e_i = (u_i,v_i,w_i)\\
e_{i+1}=(u_{i+1},v_{i+1},w_{i+1})\\
\cdots \\ 
e_M =(u_M,v_M,w_M)

という辺がある重みつき有向グラフG=(V,E)について、始点sから各頂点v_iへの最小コストd_{v_i}を求める最短経路問題

この2つから得られるd_{v_i}-d_sの最大値と、始点d_sから頂点v_iへの最小コストd_{v_i}が同じになります。

従って、

  • 2つの値の差分についての制約のみからなる
  • 値を最大化する

という条件を満たす問題は、最短経路問題に帰着して解くことができます。

計算量は、w_i\lt 0を含むならBellman-Ford法によって、O(|V||E|)、非負整数のみならDijkstra法によって、O(|E|log|V|)です。

最大値と最短経路

最短経路問題の最小コストが、線形計画問題の最大値を与えるというのがよくわかりませんでした。
この点について考察してみます。

例として、以下の有向辺を持つ有向グラフを考えます。

f:id:geam1113:20220115060606p:plain
有向グラフ

d_1 = 0とし、d_2 = 1までが求まっているとして、d_3を求めます。

有向辺を差分の制約とみなします。具体的には、
2から3への重み1の有向辺は、d_3 - d_2 \leq 1
1から3への重み3の有向辺は、d_3 - d_1 \leq 3
となります。
よって、条件はd_3 \leq 2かつd_3 \leq 3となり、最終的に右辺が小さい方の
d_3 \leq 2 という条件のみとなります。
この時の右辺は、最短経路問題における最小コストであると言えます。

d_3 \leq 2という制約において、非負整数であれば、
0,1,2のいずれでも良いわけです。しかし、有向グラフとして考えていることから、d_3 = 2が採用されます。
これは、 d_3 \leq 2という制約のなかでの最大値であると言えます。

もう少し一般化してみます。
頂点v_iが終点となる有向辺について、その有向辺の始点となる頂点をu_1,u_2, \cdots , u_mとし、その有向辺のコストをそれぞれw_1,w_2, \cdots ,w_mとします。

これを線形計画の制約とみなしたとき、 d_{v_i} \leq min(d_{u_1}+w_1,\ d_{u_2}+w_2,\ \cdots ,\ d_{u_m}+w_m) となります。右辺は最短経路問題における最小コストの計算と同じです。

また、最短経路問題と見做しているため、
d_{v_i} = min(d_{u_1}+w_1,\ d_{u_2}+w_2,\ \cdots ,\ d_{u_m}+w_m) となります。これは、制約式の最大値となります。

以上が、最短経路が最大値となる理由だろうと思います。

具体例

AtCoder Beginner Contest過去問 : 解説記事へのリンク