解题思路
并查集
1、find()函数,发现x的根
2、Union()函数,合并
代码
class Solution {
public:
//发现x的根
int find(vector<int> &parent, int x) {
if(parent[x] != x) {
parent[x] = find(parent,parent[x]);
}
return parent[x];
}
//把y的根给x的根
void Union(vector<int> &parent,int x,int y) {
parent[find(parent,x)] = find(parent,y);
}
int findCircleNum(vector<vector<int>>& isConnected) {
int n = isConnected.size();
vector<int> parent(n);
//最开始每个元素的根都是自己
for(int i = 0;i < n ;i++) parent[i] = i;
//如果两个元素有边就合并
for(int i = 0;i < n;i++) {
for(int j = i + 1;j < n;j++){
if(isConnected[i][j] == 1)
Union(parent,i,j);
}
}
int ans = 0;
for(int i = 0;i < n ;i++){
if(parent[i] == i)++ans;
}
return ans;
}
};
并查集
并查集
BFS求解
visited[]
记录是否访问过节点- 借助队列实现
class Solution {
public:
//用BFS实现
int findCircleNum(vector<vector<int>>& isConnected) {
int n = isConnected.size();
queue<int> q;
int ans = 0;
vector<int> visited(n);
for(int i = 0;i < n;i++){
if(!visited[i]) {
visited[i] = 1;
q.push(i);
while(!q.empty()){
int temp = q.front();q.pop();
visited[temp] = 1;
for(int j = 0;j < n;j++){
if(isConnected[temp][j] && !visited[j])
q.push(j);
}
}
++ans;
}
}
return ans;
}
};
DFS求解
visited[]
记录是否访问过节点
class Solution {
public:
//用DFS实现
void dfs(vector<vector<int>>& isConnected,vector<int> &visited,int n,int i){
for(int j = 0;j < n;j++){
if(isConnected[i][j] && !visited[j]){
visited[j] = 1;
dfs(isConnected,visited,n,j);
}
}
}
int findCircleNum(vector<vector<int>>& isConnected) {
int n = isConnected.size();
vector<int> visited(n);
int ans = 0;
for(int i = 0;i < n;i++){
if(!visited[i]) {
visited[i] = 1;
dfs(isConnected,visited,n,i);
++ans;
}
}
return ans;
}
};