互いに素セットは、実際に高度なデータ構造である...私はいつも彼が...への基礎となるデータ構造だと思いました(次を待つ!それは実際にはデータ構造です!)
これは、高度なデータ構造、シンプルで簡単なの最も簡単なの全てであってもよいです。データの7月に話題の構造...私は見には至っていない分割統治のいわゆる持続可能なポイント...(バッククール)。
理論的な概念
個人的に、私は互いに素-設定だと思うバックアップこの事をして、本当にあなたが現実に戻ったコードのように数行があるとしてよくないと...役に立たない理論の束と...プルアップよりもはるかに高速に理解します...
形式。我々は互いに素セットの集合体として見ることができます。初期時、各要素のそれぞれのセットに。以降の操作では、このように述べた名などのいくつかの機能をサポートしています。
マージ:2セットの1セットに
クエリ:コレクションの要素を探します
何かが偉大な推移を持っているのであれば、その後、互いに素セットは、武器を考える価値があります。ここで強調されていない何...それはバックパス圧縮ボードに従ってください。私たちは、一方で何のカウントをシミュレートし、かどうかを把握する必要があります。
コードの実装
最初は、初期化され
ボイド負荷(){ ため(int型 i = 1 ; iが<= N; iが++ ){ 父[I] = I。 } }
次にチェック
ボイド検索(INT X){ 場合(X == fater [X])戻りX。 戻り [X] =父を見つける(父[X])。 }
そして最後に
ボイドマージ(int型のx、int型のY){ 父[finx(X)] = Y。 }
そして、ばらばらのセットモデル1の側波帯のパワーがあります。このモデルでは、ルート・ノード間のパスの一部に各ノードのいくつかの情報を保存することができます。フォローアップでは、私は説明するための例を開きます。
エッジ加重互いに素セット
FAは、[x]は番号X戦艦戦艦の前に数を表します。
D [x]は船の前に数xを表します
サイズ[x]はxに設定されたルートのサイズを表します
書式#include <iostreamの> の#include <cmath> 使用して 名前空間はstdを、 const int型 MAXN = 90000 ; int型T; INT X、Y。 文字の順序; int型FA [MAXN]。 int型のサイズ[MAXN]。 int型D [MAXN]。 ボイド負荷() { ため(int型 I = 1 ; I <= 30000 ; iは++ ) { FA [I] = I。 サイズ[I] = 1 。 } } int型の検索(INT X) { 場合(X == FA [X]) { 戻りX。 } int型のルート= 探す(FA [X])。 D [X] + = D [FA [X]]。 戻り FA [X] = ルートと、 } ボイドマージ(int型のx、int型のY) { X = (X)を探します。 Y = (y)を探します。 FA [X] = Y。 D [X] = サイズ[Y]。 サイズ[Y] + = サイズ[X]。 } int型のmain() { CIN>> T; 負荷(); 一方、(T-- ) { CIN >>注文>> X >> Y。 もし(注文== ' M ' ) { (x、y)をマージ。 } 他 { 場合(検索(X)== 検索(Y)) { COUT << ABS(D [X] -d [Y]) - 1 << ENDL。 } 他 { COUT << - 1 << ENDL。 } } } }
データ範囲を見ていない、データ範囲はブラインド開いています。実際には、テンプレートへの軽微な変更は次のようにではなく、困難言及します。