C 並查集 森林實現

2021-10-23 01:11:21 字數 1268 閱讀 9852

使用森林儲存集合之間的關係,屬於同一集合的不同元素,都有乙個相同的根節點,代表著這個集合。

當進行查詢某元素屬於哪個集合時,即遍歷該元素到根節點,返回根節點所代表的集合;遍歷過程中使用路徑壓縮的優化演算法,使整體樹的形狀更加扁平,從而優化查詢的時間複雜度。

當進行合併時,即將兩顆子樹合併為一棵樹,將一棵子樹的根節點指向另一棵子樹的根節點;在合併時可按子樹的大小,將規模較小的子樹合併到規模較大的子樹上,從而使樹規模更加平衡,從而優化未來查詢的時間複雜度。

#include

class

disjointset

_count = n;}~

disjointset()

intfind

(int p)

return p;

}void

print_set()

printf

("\n");

printf

("集合: ");

for(

int i =

0; i < _id.

size()

; i++

)printf

("\n");

}void

union_

(int p,

int q)

if(_size[i]

<_size[j]

)else

_count--;}

private

: std::vector<

int> _id;

std::vector<

int> _size;

int _count;};

intmain()

執行結果為:

元素:01

2345

67集合:012

3456

7union(0

,5)元素:01

2345

67集合:012

3406

7find(0

)=0,

find(5

)=0find(2

)=2,

find(5

)=0元素:01

2345

67集合:012

3206

7元素:01

2345

67集合:010

3206

7find(2

)=0,

find(5

)=0

並查集的森林封裝

採用了啟發式策略,按秩合併和路徑壓縮技術。file disjoint set forest.h brief 並查集 include include using namespace std namespace algo 建立乙個集合 make set static disjointsetnode ma...

C 實現並查集

將n個不同的元素分成一組不相交的集合。開始時,每個元素就是乙個集合,然後按規律將兩個集合進行合併。假如已知有n個人和m對好友關係 存於陣列r 如果兩個人是直接的或間接的好友關係 好友的好友的好友.則認為他們屬於同一好友圈,請求出這n個人中有幾個好友圈。例如 n 5,m 3,r 表示有5個人,1和2是...

並查集實現(c )

1.何為並查集?並查集是一種樹型的資料結構,用於處理一些不相交集合的合併及查詢問題,簡單的說就是對集合操作的一種資料結構。2.做什麼用 考慮這樣乙個問題 若某個家族人員過於龐大,要判斷兩個是否是親戚,確實還很不容易,給出某個親戚關係圖,求任意給出的兩個人是否具有親戚關係。規定 x和y是親戚,y和z是...