參考
主要思路:
1.將每個學生視為樹的乙個結點,用乙個陣列儲存每個結點的前驅結點,當只有乙個單獨的學生的時候,將前驅設為他本身。然後每行第乙個學生a與這一行的其餘學生b1、b2……bn分別作合併操作,即a所在的樹與bn所在的樹相比較,將深度小的那一棵樹的根節點x前驅設為深度大的那一棵樹的根節點y,這樣,兩棵樹就合在一起了,這樣a和bn以及他們之前所在樹的所有結點的根結點都變為了y,在判斷是不是朋友的時候,只需要判斷他們的根節點相不相同即可。
2.深度小的樹合併到深度大的樹,深度大的樹的深度並沒有增加。
3.深度相同的兩棵樹合併,深度為比原來增加1。
2 #include 3 #include4 #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也是朋友。請編寫程式計算最大朋友圈中有多少人。輸...