第34天。
今天的题目是Friend Circles:
一道图论的题目,求连通分量的个数。这道题之前考研复试面试时遇到过。
用并查集去做会比较快,但是需要对并查集做一定修改。
简单来说,并查集的数组全初始化为0,然后在遍历到M[i][j]==true
时进行union
操作.
遍历完后,arr
中值为-1
的元素的个数就是连通分量的个数:
1vector<int> arr;2int root(vector<int> &arr, int i) {3 int root = i;4 while(arr[root] != -1) root = arr[root];5 return root;6}7void unionFunc(int i, int j) {8 i = root(arr, i);9 j = root(arr, j);10 if (i == j) return;11 arr[j] = i;12}13int findCircleNum(vector<vector<int>>& M) {14 if (M.size() == 0) return 0;15
15 collapsed lines
16 int size = M.size();17 arr = vector<int>(size, -1);18
19 for(int i = 0;i < size; i++) {20 for(int j = i+1;j < size; j++) {21 if (M[i][j]) {22 unionFunc(i, j);23 }24 }25 }26
27 int res = 0;28 for(int i = 0;i < size; i++) res += (arr[i] == -1);29 return res;30}