自然
クエリの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 。 }
最適化
- ランク合併により、
- パス圧縮
パス圧縮
我々は唯一の個々の間の特定の関係を考慮せずに、自分の先祖を考えるならば、あなたはリガで、最適化関数を見つけることができます
コード
INT(見つけるINT X){ 戻り [X] == X FAか?X:FA [X] = 見つける(FA [X])。 }