「牛ゲー」なる手法のまとめです. ABC216 G - 01Sequence で出てきました.
適用できる問題
$(c_{ij} \mid i, j \in [1, N])$ と,$S, T \in [1, N]$ が与えられる. 変数 $x_1, \ldots, x_N$ に対する制約
- $x_i - x_j \leq c_{ij}$
のもとで,$ x_T - x_S $ の最大値を求めよ.
解法
集合 $\{1, .., N\}$ 上に,$i$ から $j$ に距離 $c_{ij}$ の辺がある グラフを考える. 以下のようになる (参照 ):
- 制約を満たす解がある $\Leftrightarrow$ グラフに負閉路がない
- グラフに負閉路がない場合:
- $ x_T - x_S $ の最大値がない (いくらでも大きくできる) $\Leftrightarrow$ $T$ は $S$ から到達できない
- グラフに負閉路がなく,$T$ が $S$ から到達できる場合
- $ x_T - x_S $ の最大値は,グラフ上の $S$ から $T$ への最短路長に一致する.
最後の行が重要.特に,全部の $c_{ij}$ が非負なら, ダイクストラで解ける.