諸島(互いに素セット)

P1714] [Week4島々
制限時間:10000のMS   スペースの制限:128000キロバイト
問題の説明

1〜Nから番号湖でN-の島、。今、湖に島を結ぶ橋を作ります。双方向のトラフィックをブリッジ。

入力形式

最初の行の入力は二つの整数N、Mを有しています。
m行続いて、時間順に各列は、クエリです。
各ラインのqは照会内容の整数を表す:
= 1、Qは、次の数が2つの島、B(≠B)である場合 、
Q = 2の場合、次の数字は、島cです。

出力フォーマット

クエリごとに、それぞれの出力ラインとして順番に答え:
。Q = 1が適用されます場合は、最高お互いにB、出力はい;、bは互いに到達できない、出力No、および、Bの間で構築された場合橋。
Q = 2の場合:出力整数xは、それが島C xから出発達することができる(それ自体は、Cを除きます)。

サンプル入力

5 9
1 2 3
1 2 3
2 1
2 2
1 4 5
1 2 4
1 2 5
2 4
2 5

サンプル出力

ノー
はい
0
1
なし
なし
はい
3
3

プロンプト

データの100%、2≤n≤10,000、1≤m≤30,000へ。

 
分析:
質問1:2つの要素bが同じコレクションであり、そうでない場合は、それは2セットをマージします照会します。
質問2:要素cの集合の要素数下さい。
 
セットの合計数を追加する場合
コード:
//
の#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
#define maxnn 30100
 INT [maxnn] F、CNT [maxnn]。
int型Q;
INTのN、M。
INT GF(INT V)
{ 
    戻り F [V] == V?V:[V] = F GFを(F [V])。
} 
ボイドマージ(int型のx、int型のY)
{ 
    int型の FX = GF(X)。
    INT FY = GF(Y)。
    もし(!FX = FY)
    { 
        F [FX] = FY。
        CNT [FY] + =CNT [FX]。
    } 
} 
int型のmain()
{ 
    CIN >> N >> M。
    INT X、Y。
    
    以下のためにint型 I = 1 iは++; iが<= N 
    F [i]は = I、CNT [I] = 1 以下のためにint型 iは= 1 ; I <= M iは++ 
    { 
        CIN >> Q。
        もし(Q == 1 
        { 
            CIN >> X >> Y。
            もし(GF(X)== GF(Y))
            COUT << "はい" << ENDL;
             
            COUT << " いいえ << ENDL;
             もし((GF(X)==!GF(Y)))
            マージ(X、Y); 
        } 
        
        { 
            CIN >> X; 
            COUT < <CNT [GF(X)] - 1 << ENDL; 
        } 
    } 
    
    
    
}

 

おすすめ

転載: www.cnblogs.com/OIEREDSION/p/11260121.html
おすすめ