没有什么是连续写几遍搞不定的算法模板
1.我终于自己写出来了并查集 ,胜利胜利啊,开心
解题思路
如果两个点联通,就是1:isConnected.at(i).at(j)==1 成立,就合并,其余的就是记住并查集模板,比较容易出错的地方在于:
int findFather(int x){
if(father[x] == x) return x;
father[x] = findFather(father[x]);
//这个地方是要寻找x的父节点的父节点,而不是寻找x的父节点,
//写成:father[x] = findFather(x);//就会出错,因为每次都是传x永远跳不出循环!!
return father[x];
}
真相了:
代码
class Solution {
public:
vector<int> father;
void init(int n){
for(int i = 0; i < n; i++){
father.push_back(i);
}
}
int findFather(int x){
if(father[x] == x) return x;
father[x] = findFather(father[x]);
return father[x];
}
void unionTwo(int x, int y){
x = findFather(father[x]);
y = findFather(father[y]);
father[x] = y;
}
int findCircleNum(vector<vector<int>>& isConnected) {
int n = isConnected.size();
init(n);
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(isConnected.at(i).at(j)==1){
unionTwo(i, j);
}
}
}
int rs = 0;
for(int i = 0; i < n; i++){
if(father[i]==i) rs++;
}
return rs;
}
};