前言
並查集這三個字,取自合併、查詢、集合。
顧名思義,並查集支援兩種操作:合併和查詢
並查集的實現是乙個陣列,每個下標對應著它的父節點
int pre[
100]
;
並查集的初始化
初始化每個都是根節點,即自己的父節點就是自己,表明自己是根節點
for
(int i =
0; i < n; i++
)
並查集的查詢
並查集的查詢就是不斷地向上找,直到找到自己的根節點
int
find
(int x)
並查集的合併
假如兩個人是陌生人,突然有一天,他們發現自己祖上是乙個,為了以後方便走親戚,他們得結合成乙個大家庭,也就是讓其中乙個人的根節點變成另外乙個人的根節點的根節點。
void
merge2
(int x,
int y)
}
這樣的話,這兩個陌生人再次見面的時候,假如不知道是不是一家人的時候,就可以使用查詢函式,查詢各自的根節點,通過判斷根節點是不是同乙個,就可以判斷是不是一家人了。
並查集求集合數量
對pre
陣列進行遍歷,只要從有效結點中找出自身的上級是自己,即pre[i] = i
說明是根節點,根節點的數量就是集合的個數。
並查集相關問題
include 演算法題 1 已知有n個人構成的乙個集合,其中某些人與某些人直接是朋友關係。假定朋友關係具有傳遞性 朋友的朋友也是朋友 對稱性 相互是朋友 自反性 我是我自己的朋友 給定m組朋友關係,想要知道n個人中的任意兩個人是不是朋友關係。using namespace std typedef ...
並查集相關問題
並查集的相關知識 c 並查集實現優化 hard 給定乙個未排序的整數陣列,找出最長連續序列的長度。要求演算法的時間複雜度為 o n 示例 輸入 100,4 200,1 3,2 輸出 4解釋 最長連續序列是 1,2,3,4 它的長度為 4。hash 具體做法 取出其左右相鄰數已有的連續區間長度 lef...
並查集 並查集
本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...