DFS涂色法,并查集比较直接,这里有一个技巧,就是并查集如何看分成几类,主要看父节点是自己的点的个数有几个就行。
class Union{
private:
vector<int> p;
int n;
public:
int find(int x){
if(p[x]!=x) p[x] = find(p[x]);
return p[x];
}
Union(){}
Union(int n){
this->n = n;
p.resize(n);
for(int i=0;i<n;i++) p[i] = i;
}
void unite(int a, int b){
p[find(b)] = find(a);
}
bool isUnite(int a, int b){
return find(a)==find(b);
}
int countRoot(){
int res = 0;
for(int i=0;i<n;i++){
if(p[i]==i){
res++;
}
}
return res;
}
};
class Solution {
public:
int findCircleNum(vector<vector<int>>& M) {
int n = M.size();
Union un(n);
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(M[i][j]){
un.unite(i,j);
}
}
}
return un.countRoot();
}
};