【leetcode547】省份数量
目录
深度遍历
class Solution {
public:
int cnt,n;
vector<bool> visited;
int findCircleNum(vector<vector<int>>& isConnected) {
cnt=0;
n=isConnected.size();
for(int i=0;i<n;i++){
visited.push_back(0);
}
for(int i=0;i<n;i++){
if(!visited[i]){
dfs(isConnected,i);
visited[i]=1;
cnt++;
}
}
return cnt;
}
void dfs(vector<vector<int>>& isConnected, int node){
for(int i=0;i<n;i++){
if(isConnected[node][i]==1 && !visited[i]){
visited[i]=1;
dfs(isConnected,i);
}
}
}
};
并查集
class Solution {
public:
vector<int> fa,rank;
void init(int n){
for (int i=0;i<n;i++){
fa.push_back(i);
rank.push_back(1);
}
}
int find(int i){
if(fa[i]==i) return i;
else
{
fa[i]=find(fa[i]);
return fa[i];
}
}
void merge(int i,int j){
int x=find(i),y=find(j);
if(rank[x]<=rank[y]) fa[x]=y;
else fa[y]=x;
if (rank[x] == rank[y] && x != y) rank[y]++;
}
int findCircleNum(vector<vector<int>>& isConnected) {
int n=isConnected.size();
init(n);
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(isConnected[i][j]==1) merge(i,j);
}
}
int cnt=0;
for(int i=0;i<n;i++){
if(fa[i]==i) cnt++;
}
return cnt;
}
};