並查集的簡單介紹

2021-09-10 14:54:49 字數 1407 閱讀 7107

前幾天想把並查集這個結構搞清楚,但一直沒有動筆寫。

因為要有輸出,印象才會更深刻些。

這裡只是非常簡單的記錄一下。

並查集,顧名思義,最主要的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 ...

簡單並查集小結。

小夥伴們最近都在瘋狂的發部落格啊。我也來湊湊熱鬧。先發個簡單的並查集吧。所謂的並查集演算法是一種樹型的資料結構,用於處理一些不相交集合的合併及查詢問題。如果 給出各個元素之間的聯絡,要求將這些元素分成幾個集合,每個集合中的元素直接或間接有聯絡。在這類問題中主要涉及的是對集合的合併和查詢,因此將這種集...