並查集 維護各集合大小 連通塊中點的數量

2021-10-04 11:24:01 字數 1223 閱讀 5107

題面

給定乙個包含n個點(編號為1~n)的無向圖,初始時圖中沒有邊。

現在要進行m個操作,操作共有三種:

「c a b」,在點a和點b之間連一條邊,a和b可能相等;

「q1 a b」,詢問點a和點b是否在同乙個連通塊中,a和b可能相等;

「q2 a」,詢問點a所在連通塊中點的數量;

輸入格式

第一行輸入整數n和m。

接下來m行,每行包含乙個操作指令,指令為「c a b」,「q1 a b」或「q2 a」中的一種。

輸出格式

對於每個詢問指令」q1 a b」,如果a和b在同乙個連通塊中,則輸出「yes」,否則輸出「no」。

對於每個詢問指令「q2 a」,輸出乙個整數表示點a所在連通塊中點的數量

每個結果佔一行。

資料範圍

1≤n,m≤105

1≤n,m≤105

輸入樣例:

5 5c 1 2

q1 1 2

q2 1

c 2 5

q2 5

輸出樣例:

yes2

3

ac**
#include

#include

#include

using

namespace std;

int n,m;

int p[

100010

],si[

100010];

//表示以下標為根節點的集合的元素個數

char op[2]

;int

find

(int x)

void

merge

(int x,

int y)

intmain()

while

(m --)}

else

if(op[0]

=='q'

&& op[1]

=='1'

)else

if(op[0]

=='q'

&& op[1]

=='2')}

return0;

}

注意特判條件——當a,b已經在同乙個集合中時,應當跳過合併和計數。

需要維護乙個陣列——size表示以下標為root的集合中元素的個數,即計數大小。不能每一次q2查詢都去遍歷一次p(父節點陣列)。

連通塊中點的數量

連通塊中點的數量(並查集)

題目 連通塊中點的數量 給定乙個包含n個點 編號為1 n 的無向圖,初始時圖中沒有邊。現在要進行m個操作,操作共有三種 c a b 在點a和點b之間連一條邊,a和b可能相等 q1 a b 詢問點a和點b是否在同乙個連通塊中,a和b可能相等 q2 a 詢問點a所在連通塊中點的數量 輸入格式 第一行輸入...

並查集 合併集合,連通塊中點的數量

練習題 includeusing namespace std const int n 1e6 int n,m int p n 儲存每個點的祖宗節點 返回x的祖宗結點 路徑壓縮 int find int x int main return 0 給定乙個包含n個點 編號為1 n 的無向圖,初始時圖中沒有...

AcWing 連通塊中點的數量 並查集

時 空限制 1s 64mb 給定乙個包含n個點 編號為1 n 的無向圖,初始時圖中沒有邊。現在要進行m個操作,操作共有三種 c a b 在點a和點b之間連一條邊,a和b可能相等 q1 a b 詢問點a和點b是否在同乙個連通塊中,a和b可能相等 q2 a 詢問點a所在連通塊中點的數量 第一行輸入整數n...