具体思路:
并查集或者深搜dfs/bfs其实都可以;
注意一下并查集的路径压缩问题,这样可以减少时间复杂度;
具体代码:
class Solution {
public:
int findCircleNum(vector<vector<int>>& isConnected) {
int n=isConnected.size();
father.resize(n);
initfather(n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(isConnected[i][j])
unionfather(i, j);
}
}
return findset();
}
int findset(){
int cnt=0;
for(int i=0;i<father.size();i++){
if(father[i]==i)
cnt++;
}
return cnt;
}
void initfather(int n){
for(int i=0;i<n;i++){
father[i]=i;
}
}
int findfather(int a){
if(father[a]==a)
return a;
int fa=findfather(father[a]);
father[a]=fa;
return fa;
}
void unionfather(int a,int b){
int fa=findfather(a);
int fb=findfather(b);
if(fa==fb)
return;
father[fa]=fb;
}
private:
vector<int>father;
};