AcWing 836 合併集合

2021-09-27 04:18:09 字數 941 閱讀 8707

題目描述:

一共有n個數,編號是1~n,最開始每個數各自在乙個集合中。

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

「m a b」,將編號為a和b的兩個數所在的集合合併,如果兩個數已經在同乙個集合中,則忽略這個操作;

「q a b」,詢問編號為a和b的兩個數是否在同乙個集合中;

輸入格式

第一行輸入整數n和m。

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

輸出格式

對於每個詢問指令」q a b」,都要輸出乙個結果,如果a和b在同一集合內,則輸出「yes」,否則輸出「no」。

每個結果佔一行。

資料範圍

1≤n,m≤10^5

輸入樣例:

4 5

m 1 2

m 3 4

q 1 2

q 1 3

q 3 4

輸出樣例:

yes

noyes

分析:

並查集模板題。fa[i]儲存i節點父節點的下標,初始情況下fa[i]=i.合併操作:合併u,v,fa[find(u)] = find(v),即將節點u的根節點的父節點設為v的根節點。查詢操作:查詢x的根節點,順著x的父節點往上直至找到根節點。路徑壓縮:將從x節點到根節點路徑上每乙個節點的父節點都設為根節點。

int find(int x)
總的**如下: 

#include using namespace std;

const int maxn = 100005;

int fa[maxn],m,n;

int find(int x)

int main()

return 0;

}

AcWing 836 合併集合

並查集 功能 1.將兩個集合合併 2.詢問兩個元素是否在同乙個集合中 基本原理 1.每個集合用一棵樹表示,樹根的編號就是集合的編號 2.每個節點儲存它的父節點,fa x 表示x的父節點 問題 q1 如何判斷樹根?a1 if p x x q2 如何求x的集合編號?a2 while p x x x p ...

ACWing 836 合併集合

一共有n nn個數,編號1 n 1 sim n 1 n,最開始每個數各自在乙個集合中。現在進行m mm次操作,每次 1 m a b 將編號為a aa和b bb的兩個數所在的集合合併,如果兩個數已經在同乙個集合中,則忽略這個操作 2 q a b 詢問編號為a aa和b bb的兩個數是否在同乙個集合中 ...

AcWing 836 合併集合

一共有n個數,編號是1 n,最開始每個數各自在乙個集合中。現在要進行m個操作,操作共有兩種 第一行輸入整數n和m。接下來m行,每行包含乙個操作指令,指令為 m a b 或 q a b 中的一種。對於每個詢問指令 q a b 都要輸出乙個結果,如果a和b在同一集合內,則輸出 yes 否則輸出 no 每...