朋友圈問題(並查集)
阿新 • • 發佈:2019-02-03
問題描述:
假如已知有n個人和m對好友關係(存於數字r)。如果兩個人是直接或間接的好友(好友的好友的好友...),則認為他們屬於同一個朋友圈,請寫出程式求出這n個人裡一共有多少朋友圈。
例如:n=5,m=3,r={{1,2},{2,3},{4,5}},表示有5個人,1和2是好友,2和3是好友,4和5是好友。則1,2,3屬於一個朋友圈,4,5屬於另一個朋友圈,結果為兩個朋友圈。
根據問題:我們可以用資料結構裡的並查集來解決此問題。
問題解決:
#include <iostream> using namespace std; class UnionSet { public: UnionSet(int n) :a(new int[n]) { /*int* a=new int[n];*/ for(int i=0;i<n;i++) { a[i]=-1; } } ~UnionSet() { if(a != NULL) delete a; } int FindRoot(int x) { int root=x; while(a[root] >= 0) { root--; /* root=a[root];*/ } return root; } void Union(int root1,int root2) { int _root1=FindRoot(root1); int _root2=FindRoot(root2); if(root1 != root2) { a[_root1]+=a[_root2]; a[_root2]=_root1; } } int count(int n) { int count=0; for(int i=0;i<n;i++) { if(a[i] < 0) count++; } return count-1; } private: int *a; }; int Friends(int n,int m,int r[][2]) //int *r[] { UnionSet u(n+1); for(int i=0;i<m;i++) { u.Union(r[i][0],r[i][1]); } return u.count(n+1); }