每日一題 合併集合

2021-10-22 14:08:31 字數 1214 閱讀 9274

一共有 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≤105

輸入樣例:

4 5

m 1 2

m 3 4

q 1 2

q 1 3

q 3 4

輸出樣例:

yes

noyes

簡單明瞭的了解並查集可以參考這篇文章

分析:

簡單的並查集型別的題目。用樹來表示同一集合(指向同一根節點的就是同乙個集合)。

fa[x] 表示x節點的父節點。初始狀態時候,每個元素都是各自樹的根。

將兩個集合(x,y)合併:將x的根指向y的根(合併兩棵樹,y指向x也行),x和y在同一根下,屬於同一集合。

檢查兩個集合是否屬於同一集合:檢查兩元素的根是否相同。

#include

#include

#include

using

namespace std;

const

int n =

100005

;int fa[n]

;int n, m;

intget

(int x)

//檢查x的根

void

merge

(int a,

int b)

//合併a和b集合

intmain()

}return0;

}

每日一題 合併排序

title 每日一題 合併排序 date 2019 11 02 23 53 02 tags 73.合併排序 10分 c時間限制 3000 毫秒 c記憶體限制 3000 kb 題目內容 使用合併排序演算法,對輸入的n個資料進行按公升序排序。輸入描述 分兩行,第一行是整數n,第二行是n個整數,每個整數之...

每日一題 46 合併果子

思路在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過 n 1 次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體...

LeetCode每日一題 集合問題

子集問題,看到這種題,肯定是可以用dfs加遞迴可以做的。首先分析思路,這種類似於全排列的情況,並且順序不同算一種的話,其實就只要遞迴遍歷就可以了 這題其實就是類似於全排列的問題,顯而易見的是順利不同的組合算是乙個,例如 1,2,3 1,3,2 因為陣列中的元素是排序且無重複的,因此只需要考慮在遞迴進...