7 25 朋友圈 25分 並查集

2022-06-10 13:12:14 字數 1078 閱讀 2330

參考

主要思路:

1.將每個學生視為樹的乙個結點,用乙個陣列儲存每個結點的前驅結點,當只有乙個單獨的學生的時候,將前驅設為他本身。然後每行第乙個學生a與這一行的其餘學生b1、b2……bn分別作合併操作,即a所在的樹與bn所在的樹相比較,將深度小的那一棵樹的根節點x前驅設為深度大的那一棵樹的根節點y,這樣,兩棵樹就合在一起了,這樣a和bn以及他們之前所在樹的所有結點的根結點都變為了y,在判斷是不是朋友的時候,只需要判斷他們的根節點相不相同即可。

2.深度小的樹合併到深度大的樹,深度大的樹的深度並沒有增加。

3.深度相同的兩棵樹合併,深度為比原來增加1。

2 #include 3 #include 

4 #include 5

using

namespace

std;

6int r[30001] = ;//

儲存每個結點的前驅

7int depth[30001] = ;//

儲存樹的深度,假設乙個結點時深度為0

8int find(int k)//

查詢出根節點915

return

root;16}

17void merge(int a, int

b)18

24else

if(y 2528

else

if(x == y && x!=y)

2933}34

intmain()35;

37int

n1, n2;

38 cin >> n2 >>n1;

39for(int i=0;i<=n2;i++)r[i]=i;//

初始化,把每個單獨的結點看成一棵樹,所以前驅設為自己

40for (int i = 0; i < n1; i++)

4152}53

int max_ = 0;54

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

5560 cout << max_ <61return0;

62 }

7 25 朋友圈 25分 並查集

某學校有n個學生,形成m個俱樂部。每個俱樂部裡的學生有著一定相似的興趣愛好,形成乙個朋友圈。乙個學生可以同時屬於若干個不同的俱樂部。根據 我的朋友的朋友也是我的朋友 這個推論可以得出,如果a和b是朋友,且b和c是朋友,則a和c也是朋友。請編寫程式計算最大朋友圈中有多少人。輸入的第一行包含兩個正整數n...

7 25 朋友圈 並查集) 25 分

某學校有n個學生,形成m個俱樂部。每個俱樂部裡的學生有著一定相似的興趣愛好,形成乙個朋友圈。乙個學生可以同時屬於若干個不同的俱樂部。根據 我的朋友的朋友也是我的朋友 這個推論可以得出,如果a和b是朋友,且b和c是朋友,則a和c也是朋友。請編寫程式計算最大朋友圈中有多少人。輸入格式 輸入的第一行包含兩...

PTA 7 25 朋友圈 25分 (並查集)

7 25 朋友圈 25分 某學校有n個學生,形成m個俱樂部。每個俱樂部裡的學生有著一定相似的興趣愛好,形成乙個朋友圈。乙個學生可以同時屬於若干個不同的俱樂部。根據 我的朋友的朋友也是我的朋友 這個推論可以得出,如果a和b是朋友,且b和c是朋友,則a和c也是朋友。請編寫程式計算最大朋友圈中有多少人。輸...