問題描述:
假如已知有n個人和m對好友關係(存於數字r)。如果兩個人是直接或間接的好友(好友的好友的好友...),
則認為他們屬於同一個朋友圈,
請寫程式求出這n個人裡一共有多少個朋友圈。
假如:n = 5, m = 3,
r = {{1 , 2} , {2 , 3} ,{4 , 5}},表示有5個人,1和2是好友,2和3是好友,4和5是好友,
則1、2、3屬於一個朋友圈,4、5屬於另一個朋友圈,結果為2個朋友圈。
最後請分析所寫代碼的時間、空間複雜度。評分會參考代碼的正確性和效率。
據說用並查集來解決。。。。看不懂代碼……
//朋友圈問題#include <iostream>using namespace std;int set[10001];//帶路徑最佳化的並查集尋找演算法inline int find(int x) { int i,j,r; r = x; while(set[r] != r) {r = set[r]; }i = x;while(i != r){j = set[i];set[i] = r;i = j;} return r; } //最佳化的並查集歸併演算法inline void merge(int x, int y) { int t = find(x); int h = find(y); if(t < h) {set[h] = t; } else {set[t] = h; }}int friends(int n , int m , int r[][2]) { int i , count; //初始化並查集,各點為孤立點,分支數為n for(i = 1 ; i <= n ; ++i) {set[i] = i; } for(i = 0 ; i < m ; ++i) {merge(r[i][0] , r[i][1]); } for(i = 1 ; i <= n ; ++i) {cout << set[i] <<" "; } count = 0; for(i = 1 ; i <= n ; ++i) { if(set[i] == i) {++count; } } return count; }void main(){int n=5;int m=3;int a[][2]={{1,2},{2,3},{4,5}};cout << friends(n,m,a) <<endl;}