互いに素設定テンプレートのタイトル---- P3367 [テンプレート]互いに素セット

タイトル説明

述べたように、互いに素セットは、今そこにある、あなたがマージし、クエリ操作を完了する必要があります。

入力形式

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

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

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

紫= 2の場合、Xi及びYiが同じセット内にある出力は、Y出力場合であり、それ以外の場合は、Nを出力します

出力フォーマット

上記のように、紫= 2のそれぞれのための動作は、出力線を有し、各列は、大文字が含まれているか、またはYはNであります

サンプル入力と出力

入力#1
4 7 
2 1 2 
1 1 2 
2 1 2 
1 3 4 
2 1 4 
1 2 3 
2 1 4
出力#1
N 
Y 
N 
Y

説明/ヒント

時間の制約:1000ミリ秒、128M

データスケール:

データの30%、N <= 10、M <= 20。

データの70%を、N <= 100、M <= 1000。

データの100%に、N <= 10000、M <= 200000。

 

特別な注意:FA配列を初期化する必要があり、すべてのノードの祖先は、自分のしています

ACコードとテンプレート

#include <iostreamの>
 使用して 名前空間STD;
 のconst  int型 NN = 1E6 + 10 ;
 INT N、M;
 int型FA [NN]を、

INT(検索INT X){ // クエリと圧縮パス
    IF!(X = FA [X] )
        FA [X] = (FA [X]を見つける。);
     戻りFA [X]を; 
} 

無効に参加(int型のx、int型の Y){ // ここで、yが設定合わせXを
    int型 FY、FXは=(X)を探します= 検索(Y);
     IF(FX =!FY)
        FA [FX] =FY; 
} 

int型のmain(){ 
    CIN >> N >> M;
     のためのINT I = 1 ; Iは= Nを<; Iは++)FA [I] = I; // 各ノードは、自身の祖先である初期化
    int型OP 、T1、T2、
     一方(M-- ){ 
        scanfの(" %D%D%D "、&​​OP&T1、およびT2)、
         IF(OPは== 1 ){ 
            参加(T1、T2); // マージ 
        } 他の{
             のiF(検索(T1)==検索(T2)){ // クエリが同じ祖先である 
                COUT << " Yは、" << ENDL; 
            } { 
                COUT << " N " << ENDL; 
            } 
        } 
    } 

}

 

おすすめ

転載: www.cnblogs.com/bigbrox/p/11312272.html