ZH乳酪 資料結構與演算法 並查集基礎

2021-09-06 23:38:44 字數 1068 閱讀 7657

並查集是一種樹型資料結構,用於處理一些不相交集合的合併問題。

並查集主要操作有:

(1)合併兩個不相交集合;

(2)判斷兩個元素是否屬於同乙個集合;

(3)路徑壓縮;

用father[i]表示元素i的父親結點,例如:

用某個元素所在樹的根節點表示該元素所在集合;

判斷兩個元素是否屬於同乙個集合的時候,只需要判斷他們所在樹的根節點是否一樣即可;

也就是說,當我們合併兩個集合的時候,只需要在兩個根節點之間連邊即可。

1

int findfather(int

x)

1

bool judge(int x,int

y)

1

void unionset(int x,int

y)

每次查詢的時候,如果路徑較長,則修改資訊,以便下次查詢的時候速度更快;

(1)找到根節點;

(2)修改查詢路徑上的所有結點,將他們都指向根節點;

例如查詢下面並查集中的「20」,「9,10,20」均在查詢路徑上,則進行路徑壓縮

兩個集合合併,也就是2棵樹合併,為了降低合併後的樹的深度,一般採取將深度小的樹的樹根作為深度大的樹的樹根的孩子節點。

增加輔助空間記錄樹的深度。

合併**:

1

void unionset(int x,int

y)else

13 }

(1)銀河英雄傳說(noi2002)

(2)食物鏈(noi2001)

(3)parity(ceoi99)

資料結構與演算法之並查集

並查集結構可以用於 1 檢查兩個元素是否屬於同乙個集合 比如對於圖1這個例子來說,如果我們想要檢查節點d和節點e是否屬於同乙個集合,可以這樣操作 d節點往上找其父節點,一直往上找,直到某個節點的父節點是其本身,此時停止 找到了節點a e節點也按照相同的步驟往上找其父節點,找到節點a 如果這兩個節點往...

資料結構與演算法之並查集

並查集 union find 是一種高效的資料結構,主要的操作有 為方便敘述,把所有元素視作點,元素之間的關係視作線,存在聯絡便存在關係 需要注意的是,這裡的關係應當是1.自反的,2.對稱的,3.傳遞的 所謂合併,便是將兩個點之間 畫 一條線。又上邊的定義不難理解相連的若干點之間互相存在關係,這樣我...

演算法與資料結構(六)並查集

圖相關演算法的實現。一種不一樣的樹形結構 連線問題 connectivity problem 視覺化的來看連線問題 連線問題 左上右下是否是連線的呢?意義 實際應用中的作用 社交網路 facebook中使用者a和b中的聯絡 好友關係 是否能聯絡到。電影書籍,多 之間形成網路。網際網路網頁之間形成的網...