已知有n個人和m對好友關係(存於陣列r)。如果兩個人是直接或間接的好友(好友的好友的好友…),則認為他們屬於同乙個朋友圈,請寫程式求出這n個人裡一共有多少個朋友圈。
假如:n = 5 , m = 3 , r = , , },表示有5個人,1和2是好友,2和3是好友,4和5是好友,則1、2、3屬於乙個朋友圈,4、5屬於另乙個朋友圈,結果為2個朋友圈。
最後請分析所寫**的時間、空間複雜度。
此題最簡單並且最高效的解法就是使用並查集
並查集是一種樹型的資料結構,用於處理一些不相交集合的合併及查詢問題。常常在使用中以森林來表示。
開始時每個元素構成乙個單元素的集合,然後按一定規律將屬於同一組的元素所在的集合合併。
應用到此題時:
第一步: 有5個人,則開闢乙個 大小為6的整形陣列int set[6](0號小標沒用),將陣列初始化為-1。
第二步:合併屬於同乙個朋友圈的人。
假定乙個朋友圈有乙個領導者(相當於並查集的根),就是陣列的第乙個元素,如:1就是領導者,3是領導者。屬於同乙個朋友圈的人都要合併到領導者的名下。
先合併兩個集合到1下邊,將set[2]置為1
合併,1和3都是2的朋友,則1,2,3屬於同乙個朋友圈
合併
第三步:遍歷一遍陣列找到幾個小於0的值就表示有幾個朋友圈
題目:
做的是下面的這題,幾個人分組,求最終的分組個數,其實和小公尺的那道求朋友圈個數是一樣的,利用並查集解法,能夠大大減小空間和時間複雜度。
**實現:
#include
#define n 100000
using
namespace
std;
int father[n];
//初始化father,也就是每個結點的父節點都是它本身
void init(int n)
}int getfather(int v)
else
}//求並演算法的實現
void merge(int x, int y)
else
}int main()
init(n);
sum = 0;
for (i = 1; i <= n; i++)
for (i = 1; i <= n; i++)
}cout
<< sum << endl;
}return
0;}
並查集(求朋友圈的個數)
有如下題目 已知有n個人和m對好友關係 存於陣列r 如果兩個人是直接或間接的好友 好友的好友的好友 則認為他們屬於同乙個朋友圈,請寫程式求出這n個人裡一共有多少個朋友圈。假如 n 5 m 3 r 表示有5個人,1和2是好友,2和3是好友,4和5是好友,則1 2 3屬於乙個朋友圈,4 5屬於另乙個朋友...
並查集(小公尺麵試題求朋友圈的個數)
一 並查集的引入 以小公尺的這道題為例 並查集定義 並查集實際上是右乙個陣列實現的,這個陣列比較特殊,最開始將陣列的每乙個資料看成乙個單獨的集合,用 1表示。然後根據題目要求1和2可以合併,將第2個資料合併到1上時,array 1 array 2 array 2 1 陣列的array 1 儲存其與a...
C 求朋友圈的個數 並查集方法
有n個同學,他們之間有些是朋友,有些不是。友誼 是可以傳遞的,例如a和b是朋友,b和c是朋友,那麼a與c也是朋友 朋友圈就是完成 友誼 傳遞後的一組朋友。給定n n的矩陣代表同學間是否是朋友,如果m i j 1代表第i個學生與第j個學生是朋友,否則不是。求朋友圈的個數。例如 input 1,1,0 ...