class Solution {
public:
//查找x的父根节点
int findOp(int x, vector<int> parent) {
//如果其父节点不等于本身
while(x != parent[x]) {
x = parent[x];
}
return parent[x];
}
void unionOp(int x, int y, vector<int>& parent, int& count) {
int root_x = findOp(x, parent); //找到x的根
int root_y = findOp(y, parent); //找到y的根
if(root_x == root_y) return;
parent[root_x] = root_y;
count--;
}
int countComponents(int n, vector<vector<int>>& edges) {
/**
并查集的思路:
1.初始化: 每个节点的父节点都是自己,总的集合个数为n
2.判断edges[i]中的两个节点是否在同一个集合中(通过判断他们的父根节点是否相同)
3.如果在,则不管;如果不在,将一个的父节点置为另一个,并且让集合的总个数-1
4.返回并查集的总个数
*/
vector<int> parent(n);
int count = n;
for(int i = 0; i < n; i++) {
parent[i] = i;
}
for(int i = 0; i < edges.size(); i++) {
unionOp(edges[i][0], edges[i][1], parent, count);
}
return count;
}
};
LeetCode:并查集解决联通路径问题
最新推荐文章于 2021-10-02 00:27:47 发布