1. paizaラーニングトップ
  2. レベルアップ問題集
  3. Union-Find・クラスカル法メニュー(言語選択)
  4. 問題一覧 D(Beta)編
  5. ファインド D(Beta)編

Union-Find・クラスカル法メニューのサムネイル
ファインド D(Beta)編(paizaランク B 相当)

問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!

問題

下記の問題をプログラミングしてみよう!

この問題集では、ユニオンファインド木を利用したクラスカル法を扱います。ユニオンファインド木とは、簡単に言うと、グループ分けを管理するデータ構造です。ユニオンファインド木では、グループ同士を併合したり(ユニオン)、ある要素がどのグループに属しているかを見つけたり(ファインド)することを木構造を利用することで効率的におこなうことができます。クラスカル法とは、最小全域木問題を解くアルゴリズムの一つです。問題集の前半でユニオンファインド木の実装を、後半でユニオンファインド木を利用したクラスカル法の実装と利用をおこない、それぞれの理解を深めます。

まずはユニオンファインド木における「ファインド」をやってみましょう。

長さ 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

・ 1 行目に、整数 n が与えられます。
・ 2 行目に、数列 A の要素が左から順番に半角スペース区切りで与えられます。
・ 3 行目に、整数 x が与えられます。


入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。 標準入力からの値取得方法はこちらをご確認ください
期待する出力

x の根を求め、1 行で出力してください。
末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件

すべてのテストケースにおいて、以下の条件をみたします。

・ 入力はすべて整数
・ 1 ≦ n ≦ 10,000
・ 0 ≦ A_i ≦ n-1
・ 0 ≦ x ≦ n-1
・ x の根が存在することが保証されている

入力例1

10
0 2 9 3 2 5 6 7 3 3
4

出力例1

3

入力例2

10
0 6 2 9 4 1 6 8 8 9
4

出力例2

4

問題一覧へ戻る

ページの先頭へ戻る