前幾天想把並查集這個結構搞清楚,但一直沒有動筆寫。
因為要有輸出,印象才會更深刻些。
這裡只是非常簡單的記錄一下。
並查集,顧名思義,最主要的2大功能就是並(合併),查(查詢)。
合併 : 將2個不在同乙個集合內的元素所在的集合合併在同乙個集合。
查詢 : 看看2個元素是否在 同乙個集合內。
但是在 新建乙個這個結構的時候,就必須把全部元素拿給他,也就是說,這種結構只能處理事先已經知道全部元素是什麼的情況,不能乙個乙個的元素給他,不能處理 「流」 這種情況。
初始化 : 在給了所有元素之後,各自元素單獨成乙個集合,也就是自己指向自己,自己的父節點是自己。自己所在的集合的代表節點就是自己。
找最頭的那個節點,就是找乙個集合的代表節點: 遞迴下去,有優化途徑,就是在找的時候,以後的每個「父節點」都指向這個集合的代表節點(就是那個最終要找的節點)。也就是路徑壓縮,把長鏈給打扁平了,方便後續的查詢操作,要不然的話效能會慢些許。
合併: 將2個元素的所在的集合合併成乙個集合,以後再查的時候,這2個集合裡的所有元素都是在一起的。在合併的時候,為效能優化,就把集合裡元素少的那個集合的代表節點 指向 集合裡元素多的那個集合的代表節點。
**:
// 取乙個類node只是方便後續**實現, 具體這個node類裡是什麼都可以
public
static
class
node
}public
static
class
unionfind
private
void
makeset
(list
nodes)
}private node findfather
(node node)
fathermap.
put(node, father)
;return father;
}public
boolean
issameset
(node a, node b)
public
void
union
(node a, node b)
node ahead =
findfather
(a);
node bhead =
findfather
(b);
if(ahead == bhead)
int asetsize = sizemap.
get(ahead)
;int bsetsize = sizemap.
get(bhead);if
(asetsize <= bsetsize)
else
}}
簡單並查集
哈爾濱理工大學oj 1160 吸血鬼 description remilia是 東方紅魔館 中首次亮相的吸血鬼角色,是有著500歲年齡的吸血鬼領主。作為紅魔館的主人,有著高貴和威嚴的氣質,不過也經常任性和孩子氣。關於吸血鬼有很多傳說。吸血鬼是乙個血族,有著嚴格的等級。吸血鬼會嚴格聽從血之主人的命令。...
並查集 並查集
本文參考了 挑戰程式設計競賽 和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 ...
簡單並查集小結。
小夥伴們最近都在瘋狂的發部落格啊。我也來湊湊熱鬧。先發個簡單的並查集吧。所謂的並查集演算法是一種樹型的資料結構,用於處理一些不相交集合的合併及查詢問題。如果 給出各個元素之間的聯絡,要求將這些元素分成幾個集合,每個集合中的元素直接或間接有聯絡。在這類問題中主要涉及的是對集合的合併和查詢,因此將這種集...