一共有 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 因為陣列中的元素是排序且無重複的,因此只需要考慮在遞迴進...