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

2021-10-16 12:21:35 字數 1402 閱讀 2594

練習題:

#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)的無向圖,初始時圖中沒有邊。

現在要進行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

樣例輸入樣例:

5 5 

c 1 2 

q1 1 2 

q2 1 

c 2 5 

q2 5 

輸出樣例:

yes2

3

#includeusing namespace std;

const int n = 1e6;

int n, m;

int p[n], si[n];

//返回x的祖宗結點+路徑壓縮

int find(int x)

int main()

char op[5];

int a, b;

while (m--)

else if (op[1] == '1')

else

}return 0;

}

維護到祖宗節點距離的並查集:

int p[n], d[n];

//p儲存每個點的祖宗節點, d[x]儲存x到p[x]的距離

// 返回x的祖宗節點

int find(int x)

return p[x];

}// 初始化,假定節點編號是1~n

for (int i = 1; i <= n; i ++ )

// 合併a和b所在的兩個集合:

p[find(a)] = find(b);

d[find(a)] = distance; // 根據具體問題,初始化find(a)的偏移量

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

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

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

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

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...