首先我們來看一道題筆試題,關於朋友圈的問題:
解決這個問題,我們可以用並查集來解決。
並查集是一種資料結構,用於處理不相交集合中的合併以及查詢問題,將n個元素分成一組不相交的集合,開始時我們把每乙個元素當成乙個集合,然後按規律將集合合併。
舉例說明,首先定義乙個只有10個元素的陣列,並將每個元素的值設定為-1
假設每個元素在集合中的關係如下:
看上圖中的第乙個樹,0,6,7,8在用乙個集合中,這樣我們可以以0為根節點,分別把以6,7,8為下標的陣列中的元素值累加到以0為下標的元素上,並且將以6,7,8為下標的陣列中的值改為0,第二棵第三棵樹分別以1,2位根節點,這是陣列中的每個資料的值變成如下結果:
從圖中我們可以看出,0,1,2分別為我們假定的根節點,其中所儲存數值的絕對值就是集合中元素的個數,以3,4,5,6,7,8,9為下標的陣列元素中所儲存的值是其所屬於的集合。
接下來再繼續合併,將1為根節點的集合合併到以0為根節點的集合中,這時候又繼續改變陣列中元素的值,將下標為1的陣列元素的值加到下標為0的陣列元素的值上,並將下標為1的陣列元素值改為0,如圖:
介紹完了之後,我們來看一下**,解決剛開始的朋友圈問題:
#include
using namespace std;
class unionfindset
}int findroot(int x)
return x;
}//合併集合
void union(int x1, int x2)
}//判斷2個元素是否在乙個集合
bool isin(int x1,int x2)
//求集合的個數
int count()
return count;
}protected:
int* _set;
size_t _n;
};int friends(int n, int m, int r[2])
return ufs.count()-1;
}void testfriends()
, , , };
cout << "朋友圈的個數?"
<< friends(n, m, r) << endl;
}
並查集解決朋友圈問題
題目 加入已知n個人和m對好友關係 存於陣列r 如果兩個人是直接或間接的好友 好友的好友的好友 則認為他們屬於同乙個朋友圈。請寫程式求出這n個人裡一共有多少個朋友圈。例如 n 5,m 3,r 表示有5個人,1和2是好友,2和3是好友,4和5是好友,則1,2,3屬於同乙個朋友圈,4和5屬於另乙個朋友圈...
資料結構 並查集 解決朋友圈問題
首先我們先來看乙個栗子 朋友圈問題 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...