コンピュータサイエンスでは、互いに素設定のための木のデータ構造いくつかの互いに素な集合(互いに素な集合)合併やお問い合わせを扱います。あり、関節-検索アルゴリズム(ユニオン検索アルゴリズムが)、この操作のための2つのデータ構造を定義します。
そこには、図に示されています。
(1)自分の各ノードの祖先。
(2)各ノードの祖先の先頭を見つけます
(3)経路は、左、右の祖先として、連結された、組み合わされた圧縮します
次のコードを示しています:
#include <ビット/ STDC ++ H.> 使用して 名前空間STD; INT F [ 1005 ]; int型 POS [ 10005 ;] INT N-、M、SUM = 0 ; 無効初期の(INT N-) // 初期化機能を、各ノードは、意志先祖ノード集合 { 用(INT I = 1 ; I <= N; I ++は) { F [I] = I。 } 返します。 } INT ptr_get(INT X) // ノードのクエリ祖先ノード { IF(F [X] == X) のリターン; X それ以外の 戻りptr_get(F [X])。 } ボイド ptr_merge(int型 X、int型 Yの) //が左祖先(入力各回)ように、2つのノード、ノードをマージします { int型のT1、T2。 T1 = ptr_get(X)。 T2 = ptr_get(Y)。 もし(T1!= T2) { F [T2] = T1。 } 返します。 } INT)(メイン // メイン関数 { int型I、X、Y; int型 COUNT = 0 。 CIN >> N >> M。 INIT(N) 用(i = 1 ; iが<= N; iは++ ) { CIN >> X >> Y。 ptr_merge(X、Y) } 用(i = 1 ; I <= M; iは++ ) { もし(F [I] == I) カウント ++ ; } COUTは << <<数えてendlを。 }
トピックへのリンク:http://acm.jlnu.edu.cn/problem.php?id=1765