(一)並查集的引入
以小公尺的這道題為例
並查集定義:並查集實際上是右乙個陣列實現的,這個陣列比較特殊,最開始將陣列的每乙個資料看成乙個單獨的集合,用-1表示。然後根據題目要求1和2可以合併,將第2個資料合併到1上時,array[1]+=array[2],array[2]=1(陣列的array[1]儲存其與array[2]累加的值,這個值為負,array[2]儲存他合併到的那個結點)
通過並查集儲存過後的資料如上圖所示,那麼最後只需要計數陣列中負數的個數就是朋友圈的個數。
(二)實現**
由於面試的時候有兩種選擇,使用類或直接用函式實現,我這裡給出兩種方式的**:
1.使用c++類:
測試時包上頭檔案即可
class unionfindset
unionfindset(int size)
:_array(new int[size])
, _size(size)
int findroot(int child)
else
}void combine(int child1, int child2)
int friendcount()
}return count;
}};int friends(int n, int m, int r[2])
int friendscount = findfriends.friendcount()-1;
cout << "一共有" << friendscount << "個朋友圈"<
# includeusing namespace std;
# include"unionfindset.h"
//不寫類實現並查集方法求朋友圈個數
int findroot(int *&array, int child)
else }
int friendscount(int n,int m,int r[2])
int count = 0;
for (int i = 0; i < n; i++) }
return count - 1;
}int main()
; friendscount(5, 3, r);
}
小公尺麵試題 朋友圈問題 並查集
假如已知有n個人和m對好友關係 存於數字r 如果兩個人是直接或間接的好友 好友的好友的好友.則認為他們屬於同乙個朋友圈,請寫出程式求出這n個人裡一共有多少朋友圈。例如 n 5,m 3,r 表示有5個人,1和2是好友,2和3是好友,4和5是好友。則1,2,3屬於乙個朋友圈,4,5屬於另乙個朋友圈,結果...
並查集 小公尺筆試題求朋友圈個數,分小組個數
已知有n個人和m對好友關係 存於陣列r 如果兩個人是直接或間接的好友 好友的好友的好友 則認為他們屬於同乙個朋友圈,請寫程式求出這n個人裡一共有多少個朋友圈。假如 n 5 m 3 r 表示有5個人,1和2是好友,2和3是好友,4和5是好友,則1 2 3屬於乙個朋友圈,4 5屬於另乙個朋友圈,結果為2...
並查集(求朋友圈的個數)
有如下題目 已知有n個人和m對好友關係 存於陣列r 如果兩個人是直接或間接的好友 好友的好友的好友 則認為他們屬於同乙個朋友圈,請寫程式求出這n個人裡一共有多少個朋友圈。假如 n 5 m 3 r 表示有5個人,1和2是好友,2和3是好友,4和5是好友,則1 2 3屬於乙個朋友圈,4 5屬於另乙個朋友...