超容易理解超详细的并查集详解(一个大佬写的超详细):并查集详解
LeetCode 547 省份数量
class Solution {
public:
vector<int> father;
int find(int x)
{ // 查父节点
int root = x;
while (father[root] != -1) {
root = father[root];
}
return root;
}
bool isConnect(int x, int y)
{ // 两个节点是否联通
return find(x) == find(y);
}
void merge(int x, int y)
{ // 合并成一个集合
int root_x = find(x);
int root_y = find(y);
if (root_x != root_y) {
father[root_x] = root_y;
}
}
int findCircleNum(vector<vector<int>> &isConnected)
{
int res = isConnected.size();
for (int i = 0; i < isConnected.size(); i++) {
father.push_back(-1);
}
for (int i = 0; i < isConnected.size(); i++) {
for (int j = 0; j < isConnected.size(); j++) {
if (isConnected[i][j] == 1 && !isConnect(i, j)) {
res--;
merge(i, j);
}
}
}
return res;
}
};