並查集解決朋友圈問題

2021-08-11 11:09:50 字數 1248 閱讀 8434

題目:加入已知n個人和m對好友關係(存於陣列r),如果兩個人是直接或間接的好友(好友的好友的好友………),則認為他們屬於同乙個朋友圈。請寫程式求出這n個人裡一共有多少個朋友圈。

例如:n=5,m=3,r=,,},表示有5個人,1和2是好友,2和3是好友,4和5是好友,則1,2,3屬於同乙個朋友圈,4和5屬於另乙個朋友圈。結果為2個朋友圈。

這道題目的求解需要用到一種資料結構:並查集。我們先來介紹什麼是並查集?

將n個不同的元素分成一組不想交的集合,開始時,每個元素就是乙個集合,然後按照規律將兩個集合進行合併。

並查集也是一種樹形結構,但又與二叉樹的結構不同。

如圖,是乙個集合,且0是這個集合的父親節點,所以,在陣列中,將6,7,8的對應元素改為0,每加上乙個孩子節點,父親節點的值+(-1),所以0對應的值為-4,同理可得後面的兩個集合。在陣列中,0,1,2為父親節點,其餘為孩子節點,我們可以觀察到,父親節點對應的值都為負數,且絕對值為這個集合元素的個數,而孩子節點非負,對應元素為其父親節點。

那麼,當0,與1合併時又是怎樣?當兩個集合合併時,將它們的父親節點合併,且將其中乙個的父親節點改為另乙個即可。

//找x的根

int findroot(int x)

return x;

}//合併

void union(int x1, int x2)

}size_t size()

}return count;

}private:

vector

_sets;

};了解了並查集後,再來求解上面的題目就容易多了,看這些集合是否在同乙個並查集裡,在即使乙個朋友圈,不在則是另乙個朋友圈。

並查集解決朋友圈問題

首先我們來看一道題筆試題,關於朋友圈的問題 解決這個問題,我們可以用並查集來解決。並查集是一種資料結構,用於處理不相交集合中的合併以及查詢問題,將n個元素分成一組不相交的集合,開始時我們把每乙個元素當成乙個集合,然後按規律將集合合併。舉例說明,首先定義乙個只有10個元素的陣列,並將每個元素的值設定為...

資料結構 並查集 解決朋友圈問題

首先我們先來看乙個栗子 朋友圈問題 1 已知,有n個人和m對好友關係 存於乙個集合r中 2 如果兩個人是直接的或者間接的好友 好友的好友的好友。那麼他們屬於乙個集合,就是乙個朋友圈裡的。3 寫出程式,求這n個人中一共有多少個朋友圈。例如 n 5,m 3 r 因為集合和集合中有共同的朋友2,所以1,2...

PAT 朋友圈(並查集)

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