P1714] [Week4島々 | |
|
問題の説明
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; } } }