問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
この問題ではユニオンファインド木における「ユニオン」をやってみましょう。
長さ n の数列 A を考え、数列 A の初期値を [0, 1, ..., n-1] とします。A の i 番目 (0 ≦ i ≦ n-1) の要素 A_i は整数 i の親を表しています。
ここで、ある整数 p の親を順々にたどっていった、p の祖先(または p 自身)である q について、A の q 番目の要素が q であるとき「 p は q の根である」と定義します。つまり、A の初期値では、すべての i (0 ≦ i ≦ n-1) において、i 自身が根となっています。
整数の組 (a,b) が合計 q 組与えられます。(a_j, b_j) (1 ≦ j ≦ q) に対して a_j の根を root(a_j)、b_j の根を root(b_j) として、次の操作を与えられた順番に処理し、最後に処理がすべて終了したあとの数列 A を出力してください。
root(a_j) と root(b_j) が同じでないなら、root(b_j) の親を root(a_j) とする。
同じならば何もしない。
find
を用いて求めてください。(この関数で求めない場合、処理終了後の数列 A が正しく出力されない可能性があります。)def find(p)
if p == A_p then
return p
else
return find(A_p)
end if
n q
a_1 b_1
...
a_q b_q
数列 A の i (0 ≦ i ≦ n-1) 番目の要素が i 行目となるように、合計 n 行出力してください。
末尾に改行を入れ、余計な文字、空行を含んではいけません。
すべてのテストケースにおいて、以下の条件をみたします。
・ 入力はすべて整数
・ 1 ≦ n ≦ 10,000
・ 1 ≦ q ≦ n
・ 0 ≦ a_j, b_j ≦ n-1 (1 ≦ j ≦ q)
・ a_j ≠ b_j (1 ≦ j ≦ q)
6 5
4 5
3 4
2 3
1 2
0 5
0
0
1
2
3
4
10 8
8 9
6 8
2 6
5 7
4 5
1 4
2 9
1 7
0
1
2
3
1
4
2
5
6
8