並查集,實現簡單,功能強大

2021-09-25 15:33:52 字數 1247 閱讀 9136

並查集中,只需要實現最簡單的 getfather(node)  以及  unionnode(node, node)  就能使用了。

在處理是否聯通問題裡面,特別好用,寫一下基本實現過程, mark 一下

主要有乙個 famap 來儲存每個節點的父節點,可以為雜湊表,也可以為 vector 

在節點為 int 型,並且元素範圍固定的情況下,vector 更高效

sizemap 同理,儲存每個並查集的大小,

獲取父親節點  getfa 函式,通過遞迴呼叫來實現查詢 父親節點, 為的是,  在遞迴返回的過程中,

famap[a] = fa;   這一句來使較深的節點全都指向頭結點

兩個節點合併的操作,會返回這兩個節點合併後的  並查集的大小,通常用於 提前終止迭代過程,

即所有節點都在乙個並查集中時,後面就再也不會發生 合併的操作了

vecto***map;

vectorsizemap;

int getfa(int a)

int unionmap(int a, int b)

// 初始化並查集

famap.resize(n), sizemap.resize(n);

for(int i=0; i通過乙個例題來說明一下 1135. 最低成本聯通所有城市

解題思路,先把鏈結按照權重排序,然後初始化並查集,

最後遍歷權重陣列,檢視當前鏈結的兩個點是否同屬乙個並查集,若屬於就不進行 合併操作,

若不屬於,則進行合併操作, res  需加上當前權重,因為 合併操作會返回當前並查集的大小

若返回大小為  n  , 則證明所有城市聯通,提前終止返回  res  即可,若走到最後也沒返回,則證明無法將所有城市聯通

class solution

// 確認兩個點為父節點,並且不相連

int unionmap(int fa, int fb)

public:

int minimumcost(int n, vector>& conections) );

for(int i=0; i再通過乙個例題來說明一下 547. 朋友圈

這個題目應用並查集就很簡單了, 連 sizemap  都不需要都可以做,判斷是否有線,然後放到一起就行

class solution

void unionmap(int a, int b)

public:

int findcirclenum(vector>& m)

};

php 簡單並查集實現

n 10 10個結點 case 7 7組關係,如下 data array array 2,4 array 7,5 array 1,3 array 8,9 array 1,2 array 5,6 array 2,3 ufstree array function make set ufstree,n f...

並查集的簡單實現

並查集的特點 1.可以高效查詢元素 a 和元素b是否屬於同一組 2.合併元素a和元素b所在的組 無法分割 初始化 n個節點來表示元素,最開始沒有邊。合併 從乙個組的跟向另乙個組連邊,這樣兩棵樹就變成了一棵樹,也就把兩個組合並為乙個組了。查詢 為了查詢兩個節點是否屬於同乙個組,我們需要沿著樹往上走,來...

簡單並查集

哈爾濱理工大學oj 1160 吸血鬼 description remilia是 東方紅魔館 中首次亮相的吸血鬼角色,是有著500歲年齡的吸血鬼領主。作為紅魔館的主人,有著高貴和威嚴的氣質,不過也經常任性和孩子氣。關於吸血鬼有很多傳說。吸血鬼是乙個血族,有著嚴格的等級。吸血鬼會嚴格聽從血之主人的命令。...