C 實現並查集

2021-07-23 06:51:59 字數 1206 閱讀 5126

將n個不同的元素分成一組不相交的集合。

開始時,每個元素就是乙個集合,然後按規律將兩個集合進行合併。

假如已知有n個人和m對好友關係(存於陣列r),如果兩個人是直接的或間接的好友關係(好友的好友的好友....),則認為他們屬於同一好友圈,請求出這n個人中有幾個好友圈。

例如:n=5,m=3,r=,,},表示有5個人,1和2是好友,2和3是好友,4和5是好友,則1.2.3屬於乙個朋友圈,4.5屬於乙個另朋友圈,結果為兩個朋友圈。

最後請分析所寫**的時間、空間複雜度。

這個題用利用並查集實現會比較簡易和高效!

#define _crt_secure_no_warnings 1

#include#includeusing namespace std;

class unionfindset

~unionfindset() }

void merge(int root1, int root2)

while (_array[root1] >= 0)

_array[root1] += _array[root2];

_array[root2] = root1;

} int find(int child)

return child;

} void print()

cout << endl;

} int friends(int n, int m, int r[2])

uf.print();

int count = 0;

for (int i = 1; i <= n; i++)

}return count;

}private:

int* _array;

size_t _size;

};void test()

, , };

int frindcirle = us.friends(n, m, r);

cout << frindcirle << endl;

}int main()

並查集實現(c )

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

C 並查集 森林實現

使用森林儲存集合之間的關係,屬於同一集合的不同元素,都有乙個相同的根節點,代表著這個集合。當進行查詢某元素屬於哪個集合時,即遍歷該元素到根節點,返回根節點所代表的集合 遍歷過程中使用路徑壓縮的優化演算法,使整體樹的形狀更加扁平,從而優化查詢的時間複雜度。當進行合併時,即將兩顆子樹合併為一棵樹,將一棵...

並查集 並查集

本文參考了 挑戰程式設計競賽 和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 ...