首先我們先來看乙個栗子:
朋友圈問題:
1、已知,有n個人和m對好友關係(存於乙個集合r中)
2、如果兩個人是直接的或者間接的好友(好友的好友的好友。。。),那麼他們屬於乙個集合,就是乙個朋友圈裡的。
3、寫出程式,求這n個人中一共有多少個朋友圈。
例如:
n=5,m=3;
r=,,};
因為集合和集合中有共同的朋友2,所以1,2,3屬於同乙個朋友圈,4和5與其它集合沒有共同元素,所以4和5屬於乙個朋友圈。
那麼怎麼解決這個問題呢?
在之前我們學習了雜湊表,所以很容易想到用雜湊表來解決這個問題,具體解法如下所示:
雜湊表雖然可以解決這類問題,但是當關係變得複雜點就十分容易出錯,而且實現起來比較複雜,那有沒有更好的方法呢,就是今天所要描述的並查集。
並查集是一種樹型的資料結構,用於處理一些不相交集合(disjoint sets)的合併及查詢問題。常常在使用中以森林來表示。並查集是一種 不相交集合 的資料結構,設有乙個動態集合s=,每個集合通過乙個代表來標識,代表 就是動態集合s 中的某個元素。比如,若某個元素 x 是否在集合 s1 中(find操作),返回集合 s1 的代表元素即可。這樣,判斷兩個元素是否在同乙個集合中也是很方便的,只要看find(x) 和 find(y) 是否返回同乙個代表即可。
(1)首先用vector動態開闢乙個長度為n+1的陣列_v(n+1更符合使用者的使用心態)。
(2)將這些陣列內容初始化為-1;
(3)查詢,查詢元素所在的集合,即根節點。
(4)合併,將兩個元素所在的集合合併為乙個集合。通常來說,合併之前,應先判斷兩個元素是否屬於同一集合,這可用上面的「查詢」操作實現。
void join(int x, int y)//求交集
}int unioncount()
return count-1;//否則說明朋友圈出錯
}void show()
cout
<< endl;
}private:
int find(int x)//查詢父節點
private:
vector
_v;};
測試函式:
void uniontext()
執行結果:
並查集解決朋友圈問題
首先我們來看一道題筆試題,關於朋友圈的問題 解決這個問題,我們可以用並查集來解決。並查集是一種資料結構,用於處理不相交集合中的合併以及查詢問題,將n個元素分成一組不相交的集合,開始時我們把每乙個元素當成乙個集合,然後按規律將集合合併。舉例說明,首先定義乙個只有10個元素的陣列,並將每個元素的值設定為...
並查集解決朋友圈問題
題目 加入已知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個人中一共有多少個朋友圈 文字描...