F - The Shortest Statement
問題概要
頂点
辺の連結な重み付き無向グラフが与えられる。
個のクエリに答えよ。
番目のクエリでは頂点
間の最短距離を答えよ。
考えたこと
木っぽいグラフが与えられるということなので、とりあえず木に場合について考えてみることにする。 木の場合はまんまLCAを使うことができます。具体的には
- 適当な1頂点を根として、根付き木を考える。この根から各頂点への最短距離をbfsでもして求めておく。
に対して、これらのLCAを
で求め、それを
とおく。
間の最短距離は、
である。
次はこれをいまのグラフに拡張してみましょう。
グラフから適切に辺を本削除すると木になります。
削除された辺につながっている頂点の集合を
とします。
元のグラフ上での2頂点間の最短経路はもちろん削除された辺を通る場合があります。そこで、削除された辺も含めたの
中の任意の2頂点間の距離をワーシャルフロイドで事前計算しておきます。
このとき、間の最短距離は次のように計算することができます。
- 最短距離を木上での最短距離で初期化します。
から木上を通って
までいき、そこから
に抜けて、
から木上を通って
に行く経路をすべての
の組み合わせについて計算し、最短距離を更新する
定数倍が重めですが、でこの問題を解くことができました。