7 25 朋友圈 25分 通過並查集實現

2021-10-07 06:39:00 字數 846 閱讀 9060

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

輸入的第一行包含兩個正整數n(≤30000)和m(≤1000),分別代表學校的學生總數和俱樂部的個數。後面的m行每行按以下格式給出1個俱樂部的資訊,其中學生從1~n編號:

第i個俱樂部的人數mi(空格)學生1(空格)學生2 … 學生mi

輸出給出乙個整數,表示在最大朋友圈中有多少人。

7 4

3 1 2 3

2 1 4

3 5 6 7

1 6

4
利用並查集來實現朋友圈合併,通過陣列來儲存每個朋友圈之間的關係,陣列索引代表學生編號,值為該編號父結點的學生編號。根結點值為負數,取正之後表示該子樹的節點數。

初始時每個節點值均為-1,表示每個節點均為乙個子樹。每當輸入乙個俱樂部成員資訊,其他學生均與第乙個學生進行並查集操作。

並查集操作:首先查詢兩個結點的根,如果根不一致,則需要將兩個子樹合併。以前乙個子樹的根作為合併後子樹的根,其值更新為兩個根之和,將後乙個子樹的根指向前乙個子樹。

#include using namespace std;

#define max 30000

void union(int x,int y,int sn);

int findroot(int x,int sn);

int main()

7 25 朋友圈 25分 並查集

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

7 25 朋友圈 並查集) 25 分

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

7 25 朋友圈 25分 並查集

參考 主要思路 1.將每個學生視為樹的乙個結點,用乙個陣列儲存每個結點的前驅結點,當只有乙個單獨的學生的時候,將前驅設為他本身。然後每行第乙個學生a與這一行的其餘學生b1 b2 bn分別作合併操作,即a所在的樹與bn所在的樹相比較,將深度小的那一棵樹的根節點x前驅設為深度大的那一棵樹的根節點y,這樣...