dfs
每次拿到一个没有访问的节点
就dfs一遍把它和它的朋友都标记了
最后看看dfs了几次就有几个朋友圈
class Solution {
public:
vector<bool>visit;
int findCircleNum(vector<vector<int>>& M) {
if(M.size()==0){
return 0;
}
visit = vector<bool>(M.size(),false);
int ret = 0;
for(int i=0;i<M.size();i++){
if(!visit[i]){
dfs(i,M);
ret++;
}
}
return ret;
}
bool dfs(int i,vector<vector<int>>& M){
visit[i] = true;
for(int j=0;j<M[i].size();j++){
if(M[i][j]==1 && visit[j] == false){
dfs(j,M);
}
}
return true;
}
};
并查集
class US{
public:
vector<int> parent;
US(int n){
parent = vector<int> (n,0);
for(int i=0;i<n;i++){
parent[i] = i;
}
}
int findP(int n){
while( parent[n] !=n ){
n = parent[n];
}
return n;
}
bool unionxy(int x,int y){
int yp = findP(y);
int xp = findP(x);
parent[yp] = xp;
return true;
}
};
class Solution {
public:
vector<bool>visit;
int findCircleNum(vector<vector<int>>& M) {
US u(M.size());
for(int i=0;i<M.size();i++){
for(int j=0;j<M[i].size();j++){
if(M[i][j]==1){
u.unionxy(i,j);
}
}
}
int ret = 0;
for(int i=0;i<M.size();i++){
if(u.parent[i] == i){
ret++;
}
}
return ret;
}
};