問題
ある地域には $N$ 個の駅と $M$ 本の鉄道路線があります。
駅には $1$ から $N$ までの番号が付けられていて、$i$ 本目の路線は駅 $A_i$ と駅 $B_i$ を双方向に結んでいます。
この地域に台風が上陸すると、いくつかの路線は運休になってしまいます。
以下のようなクエリ―が $Q$ 個与えられるのでそのクエリ―を処理してください。
クエリー1:$x$ 本目の路線が運休になる。
クエリー2:運休状況を踏まえて駅 $s$ から駅 $t$ へ移動できるかどうかを答える。
解き方・ソースコード
この問題も前回記事同様、Union-Find木を使って解いていきますが、辺を減らしながらの連結状況を答えるのは難しいので、クエリーを逆向きにして辺を増やしながら処理することにします。
まずソースコードの冒頭では、次のように入力データを設定しています。
・N: 頂点の数(駅の数)。
・M: 辺の数(2つの駅を結ぶ路線の数)。
・edges: 辺のリスト。各要素は、頂点の番号のペアで表される。
・Q: クエリ―の数。
・query: クエリ―のリスト。各要素は、1または2の数字と、いくつかの頂点の番号の組み合わせで構成される。
このプログラムは、以下のような処理を行います。
1.辺のリストをインデックス0から始まるように修正する。
2.クエリ―に応じて、最後まで残っている辺のリストを取得する。
3.Union-Find木を用いて、最後まで残っている辺でグラフを構成する。
4.クエリ―を逆順に処理し、連結を増やしながら移動可能かどうかの回答を求める。
5.回答を出力する。
Union-Find木を使ってグラフを構成していきます。
Union-Find木は、グループを管理するためのデータ構造です。
各要素は、自身が属するグループの根の番号を覚えています。
グループをマージするときには、根の番号を統一します。
これによって、任意の2つの要素が同じグループに属するかどうかを簡単に判定することができます。
このプログラムは、最後まで残っている辺でグラフを構成します。
そして、クエリ―を逆順に処理しながら、Union-Find木を使ってグループをマージしていきます。
最後に、各クエリ―に対する回答を出力します。
[Google Colaboratory]
1 | #-------- 入力例1 --------- |
[実行結果(入力例1)]
移動可能 移動可能 移動不可
クエリ―に応じて、駅間の移動ができるかどうかを出力することができました。