高度なデータ構造 - ばらばらセット

互いに素セットは、実際に高度なデータ構造である...私はいつも彼が...への基礎となるデータ構造だと思いました(次を待つ!それは実際にはデータ構造です!)

これは、高度なデータ構造、シンプルで簡単なの最も簡単なの全てであってもよいです。データの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。
            } 
        } 
    }
}

データ範囲を見ていない、データ範囲はブラインド開いています。実際には、テンプレートへの軽微な変更は次のようにではなく、困難言及します。

 

おすすめ

転載: www.cnblogs.com/Uninstalllingyi/p/11232734.html