問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
この問題集では、ユニオンファインド木を利用したクラスカル法を扱います。ユニオンファインド木とは、簡単に言うと、グループ分けを管理するデータ構造です。ユニオンファインド木では、グループ同士を併合したり(ユニオン)、ある要素がどのグループに属しているかを見つけたり(ファインド)することを木構造を利用することで効率的におこなうことができます。クラスカル法とは、最小全域木問題を解くアルゴリズムの一つです。問題集の前半でユニオンファインド木の実装を、後半でユニオンファインド木を利用したクラスカル法の実装と利用をおこない、それぞれの理解を深めます。
まずはユニオンファインド木における「ファインド」をやってみましょう。
長さ n の数列 A が与えられます。A の i 番目(0 ≦ i ≦ n-1)の要素 A_i は整数 i の親を表しています。
ここで、ある整数 p の親を順々にたどっていった、p の祖先(または p 自身)である q について、A の q 番目の要素が q であるとき「 p は q の根である」と定義します。ユニオンファインド木において、ある要素の根を求めることを一般的にファインドといいます。
整数 x が与えられるので、x の根を出力してください。
n
A_1 ... A_n
x
x の根を求め、1 行で出力してください。
末尾に改行を入れ、余計な文字、空行を含んではいけません。
すべてのテストケースにおいて、以下の条件をみたします。
・ 入力はすべて整数
・ 1 ≦ n ≦ 10,000
・ 0 ≦ A_i ≦ n-1
・ 0 ≦ x ≦ n-1
・ x の根が存在することが保証されている
10
0 2 9 3 2 5 6 7 3 3
4
3
10
0 6 2 9 4 1 6 8 8 9
4
4