noshi91のメモ

データ構造のある風景

1 辺を除いたときの最短路長

問題設定

無向グラフ  G = (V, E), 非負の辺重み  w \colon E \to \mathbb R _ {\geq 0}, 始点  s \in V, 終点  t \in V が与えられる。 各  e \in E について、 (V, E \setminus \lbrace e \rbrace) 上での  s \text{-} t 最短路長を求めよ。

この問題を  \mathrm O ( \lvert E \rvert \log \lvert E \rvert) の時間計算量で解くアルゴリズムを説明する。

本質的に同じ問題が https://codeforces.com/contest/1163/problem/F で出題されており、解説するアルゴリズムは tutorial にあるものと同じである。 ただしこの tutorial には証明がないため注意。

アルゴリズム

議論を簡易にするため、まず辺重みは  0 を含まないものとする。 このとき、以下のアルゴリズムが正しく答えを計算する。

まず、 s を始点とする最短路木  T _ s t を始点とする最短路木  T _ t をとる。 ただし、両者で  s \text{-} t パス部分が一致するようにし、それを  P とおく。  e \notin P を取り除いたときの最短路長は明らかに  w(P) である。

各辺  uv \notin P に対し以下の処理を行う。

  •  T _ s における  u tLCA、すなわち  T _ s における  s \text{-} u パスが  P と分岐する頂点を  x とする。
  • 同様に、 T _ t における  v sLCA y とする。
  •  P 上で  x \lt y ならば、 T _ s に沿って  s \to u と移動し、 uv を通り、 T _ t に沿って  v \to t に至るパスは  x y の間にある各辺  e \in P を通らない。よってそれらの辺に対し、 e を取り除いた際の最短路長の候補に  d(s, u) + w(uv) + d(v, t) を追加する。

ただし、 uv は順序対として扱う、すなわち  vu にも上記の処理を行うものとする。 処理が全て終わったとき、候補の中で最短のものが求める答えである。 候補の中での最短の計算は、双対セグメント木を使ったり、std::set などのデータ構造を使って imos 法のような処理を行えばよい。

証明

 e \in P を固定し、 e に関する答えが正しく計算されることを示す。

補題

任意の頂点  c \in V に対し、以下の両方が成り立つことはない。

  •  T _ s における  s \text{-} c パスが  e を含む
  •  T _ t における  t \text{-} c パスが  e を含む

証明(補題)

同時に成り立つ  c \in V が存在すると仮定する。  s \text{-} c パスと  t \text{-} c パスが  e で交差しているが、 e の前後でパスを組み替えると、合計長が真に短いパスの組が得られるため、それぞれが最短路だったことと矛盾する。  w(e) \gt 0 を使用したことに注意せよ。  \blacksquare

 T _ s における  s \text{-} c パスが  e含まない ような  c s \text{-side} T _ t における  t \text{-} c パスが  e含まない ようなものを  t \text{-side} と呼ぶことにする。 補題より、全ての頂点は  s \text{-side} であるか  t \text{-side} である。 両方に該当する頂点は好きな方に割り当てておく。

 (V, E \setminus \lbrace e \rbrace) における  s \text{-} t 最短路を  1 つとり  Q とする。  s s \text{-side} であり  t t \text{-side} であることから、 Q 上の辺  uv であって  u s \text{-side},  v t \text{-side} であるものが存在する。 また、 \text{side} の関係から  uv \notin P である。 するとアルゴリズム中でこの  uv に対して構成されるパスは  e を通らず、かつ  Q と同じ長さであるため、 e に対する答えが正しく計算される。  \blacksquare

辺の長さが  0 を含む場合

この場合、 T _ s T _ t の取り方によってはアルゴリズムが誤った答えを返すことがある。 補題が成り立つように適切に取ればよいが、最も証明が明らかな方法は重み  0 の辺を重み  \varepsilon にすることである。

注意

有向グラフに対してはこのアルゴリズムは正しく動作しない。 証明において破綻するのは、補題 s \text{-} c パスと  c \text{-} t パスの組み換えを行った部分である。