並查集演算法主要分為quic-find, quick-union以及union-find方法。但出於效率考慮,一般使用union-find演算法進行實際操作。
union-find演算法的思想就是利用乙個陣列id記錄每個節點的父節點,例如現要將節點1(id[1] = 1)連線到節點2(id[2] = 2),則令id[1] = 2即可;同時,若節點為根節點,則令其id值等於其自身。通過這種方式,可將序列轉化為由許多樹組成的森林,若要判斷兩節點是否連通,只需比較二者根節點是否相同即可。
但為了進一步演算法效率,我們還可以再建立乙個陣列sz來記錄每棵樹的大小,使得在將兩棵樹歸併時只會將小樹連線到大樹上,從而盡可能減小最終結果中樹的高度,進一步優化演算法。
以下就是我用c++實現的union-find的**:
#ifndef union_find_h
#define union_find_h
class union_find
; int _num() ;
bool connected(int p, int q) ; //判斷是否聯通
int _find(int p); //尋找根節點
void _union(int p, int q); //連線兩棵樹
};#endif
#include "union_find.h"
union_find::union_find(int n)
}int union_find::_find(int p)
void union_find::_union(int p, int q)
else
}num--; //分量數減一
}
並查集詳解 例題合集
擒賊先擒王 解密犯罪團夥 沒錯,就是他們,為了下層勞動階級的利益開始擾亂朝廷治安了。雖然他們是一家人,但是這些好漢們分成了許多隊伍分開出動,我們需要做的是確定他們分成了多少個隊伍。我們先來了解一下並查集 並查集,並查集是一種樹形結構,又叫 不相交集合 保持了一組不相交的動態集合,每個集合通過乙個代表...
並查集演算法
所謂並查集,它是乙個集合,這個集合的元素也是集合,他支援三種操作 makeset x 建立乙個只有乙個元素x的集合x0,將這個集合放入並查集中 findset x 在並查集中尋找乙個元素s 注意並查集的元素s也是集合 滿足 x屬於s union x,y 將並查集中的元素s1,s2合併,其中x屬於s1...
並查集演算法
並查集是一種樹型的資料結構,用於處理一些不相交集合 disjoint sets 的合併及查詢問題。常常在使用中以森林來表示。讓每個元素構成乙個單元素的集合,也就是按一定順序將屬於同一組的元素所在的集合合併。1 makeset s 建立乙個新的並查集,包含s個單元素集合。2 union x,y 把x ...