互いに素セット(UnionFind)

自然

クエリの2つの要素が同じクラスに属しています

親戚の画像を比較し、AはBの父で、BはCの父親で、AとCとの間の関係が存在するかどうかを尋ねました。

また、1,2,3 3つの都市、道路1-- 2,2、市道することができます - 3、Q 1 3都市は都市に到達することができます。

サンプル

最初の行は、2つの整数N、Mを含み、NはMの要素と操作の合計を表します。

次のM行、三つの整数紫、西、李を含む各行

場合紫= 1、Xi及び李の合成組

紫= 2のとき、出力Xi及びYiが同じセット内にある、それはY出力場合であり、そうでない場合、出力N場合。

4 7 
2 1 2 
1 1 2 
2 1 2 
1 3 4 
2 1 4 
1 2 3 
2 1 4

ナイーブコード

#include <ビット/ STDC ++ H> 使用して名前空間STDを、const int型 N = 100001 ; INTのN、M。
INT FA [N]。INT(見つけるINT X){
     戻り [X] == X FAか?X:(FAが[X])を見つけます。
} ボイド UNI(int型のx、int型のY){ 
    FAは、[(X)検索] = (y)を見つけます。
} INT(ASK int型のx、int型のY){
     戻り検索(X)== 検索(y)を、
} int型のmain(){ 
    CIN >> N >>

 

 








メートル;
    以下のためにint型 i = 1 ; iは= N <; ++ I)FA [I] = I。// 最开始只和自己有关系
    ためint型 I = 1、X、Y、Z、I <= M; ++ I){ 
        CIN >> Z >> X >> Y。
        もし(Z == 1 )一方向(X、Y)
        の(x、y)==尋ねる本当printf(" Yの\ n "):のprintf(" Nの\ n " ); 
    } 
    戻り 0 
}

 最適化

  1. ランク合併により、
  2. パス圧縮

パス圧縮

我々は唯一の個々の間の特定の関係を考慮せずに、自分の先祖を考えるならば、あなたはリガで、最適化関数を見つけることができます

コード

INT(見つけるINT X){
     戻り [X] == X FAか?X:FA [X] = 見つける(FA [X])。
}

 

おすすめ

転載: www.cnblogs.com/Adventurer-H/p/11224896.html
おすすめ