目錄並查集是一種維護集合的資料結構,並:union
,查:find
,集:set
。
並查集支援下面兩種操作:
合併:合併兩個集合
查詢:判斷兩個元素是否在乙個集合
並查集使用乙個陣列實現
int father[n];
其中 father[i] 代表元素 i 的父親節點,而父親節點本身也是這個集合內的元素。
如果father[i] == i
說明元素 i 是該集合的根結點,但是對於同乙個結合來說只存在乙個根結點,且將其作為所屬集合的標識
乙個實現初始化
father
陣列,但我們通常還會初始化另外乙個輔助的資料結構height[n]
, 來記錄每個結點的深度,以使得我們的並查集的效率不會太差,不會生成乙個非常長高的單鏈。
#define n 1001
int father[n]; //記錄父節點
int height[n]; //記錄每個節點的高度
void initial(int n)
}
由於同乙個集合只存在乙個根結點,所以查詢操作就是對給定的結點尋找其根結點的過程。
// 遞迴
int find(int x)
return x;
}// 非遞迴
int find(int x)
return x;
}
把兩個集合合併成乙個,思路:
首先判斷兩個元素是否是同乙個集合,就是看二者是否有相同的根結點
如果不是同乙個集合,那麼把乙個集合的根結點的父親指向另乙個集合的根結點
void union(int x, int y)
else if (height[x] > height[y])
else
}}
樹的應用 並查集
首先,什麼是並查集?並查集是一種簡單的集合表示。我們可以簡單的思考一下這個名字,集 應該就是集合的意思,而 並 和 查 估計是兩種動作或者形容。這個我們後面慢慢就知道了。乙個結合中有若干個元素,我們通常將該集合劃分成若干個子集。我們通常用樹的雙親表示法,作為並查集的儲存結構。我們一般將每個子集,表示...
樹 並查集的原理和實現
並查集是一種維護集合的資料結構,並 union,查 find,集 set。並查集支援下面兩種操作 合併 合併兩個集合 查詢 判斷兩個元素是否在乙個集合 並查集使用乙個陣列實現 int father n 其中 father i 代表元素 i 的父親節點,而父親節點本身也是這個集合內的元素。如果fath...
樹的應用 森林 並查集
並查集屬於不相交的資料結構,可以用乙個根節點代表整棵樹來進行判斷,並查集的核心簡化步驟有乙個就是在構建樹的時候應用了路徑壓縮 以便之後查詢的時候速度更加快捷 以下貼出例題原始碼,並在原始碼中講解並查集的四個模板函式 include iostream include cstdio using name...