將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 ...