1.解析
题目大意,给定朋友关系矩阵,求解有多少个朋友圈。(A是B的朋友,B是C的朋友,则A和C是朋友,即关系具有传递性)
2.分析
这道题如果看表面题意,还是比较难的,我们可以抽象一下。例如,题目中所给的例子:[[1,1,0],[1,1,0],[0,0,1]],转换题目意思就是,给定3个城镇,编号为0-2,编号为0和1的城镇之间是连通的,求解有多少条连通路径。很明显,这就是并查集的基本运用,比较简单。
class Solution {
public:
int findCircleNum(vector<vector<int>>& M) {
int res = 0, n = M[0].size();
vector<int> nums(n);
for (int i = 0; i < n; ++i) nums[i] = i;
for (int i = 1; i < n; ++i){
for (int j = 0; j < i; ++j){
if (M[i][j] == 1){
int a = getRoot(nums, i);
int b = getRoot(nums, j);
if (a != b){
nums[a] = b;
}
}
}
}
for (int i = 0; i < n; ++i)
if (nums[i] == i)
res++;
return res;
}
int getRoot(vector<int>& nums, int root){
int son = root;
while (root != nums[root]) root = nums[root];
while (son != root){ //路径压缩
int t = nums[son];
nums[son] = root;
son = t;
}
return root;
}
};