並查集(小公尺麵試題求朋友圈的個數)

2021-07-11 19:06:50 字數 1265 閱讀 3846

(一)並查集的引入

以小公尺的這道題為例

並查集定義:並查集實際上是右乙個陣列實現的,這個陣列比較特殊,最開始將陣列的每乙個資料看成乙個單獨的集合,用-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屬於另乙個朋友...