题目:547. 省份数量
方法一:深度优先搜索dfs。
class Solution {
public:
bool sta[210];
void dfs(int u,vector<vector<int>>& isConnected){
sta[u]=1;
for(int i=0;i<isConnected.size();i++){
if(!sta[i]&&isConnected[u][i]) dfs(i,isConnected);
}
}
int findCircleNum(vector<vector<int>>& isConnected) {
memset(sta,0,sizeof sta);
int ans=0;
for(int i=0;i<isConnected.size();i++){
if(!sta[i]){
ans++;
dfs(i,isConnected);
}
}
return ans;
}
};
方法二:广度优先搜索bfs。
class Solution {
public:
int findCircleNum(vector<vector<int>>& isConnected) {
int n=isConnected.size();
vector<bool> sta(n,0);
int ans=0;
for(int i=0;i<n;i++){
if(sta[i]) continue;
sta[i]=1;
ans++;
queue<int> qu;
qu.push(i);
while(qu.size()){
int x=qu.front();
qu.pop();
for(int j=0;j<n;j++){
if(!sta[j]&&isConnected[x][j]){
sta[j]=1;
qu.push(j);
}
}
}
}
return ans;
}
};
方法三:并查集
class Solution {
public:
int p[210];
int findd(int u){
if(p[u]!=u) p[u]=findd(p[u]);
return p[u];
}
int findCircleNum(vector<vector<int>>& isConnected) {
int n=isConnected.size();
for(int i=0;i<n;i++) p[i]=i;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(isConnected[i][j]){
int x=findd(i),y=findd(j);
if(x!=y) p[x]=y;
}
}
}
int ans=0;
for(int i=0;i<n;i++){
if(p[i]==i) ans++;
}
return ans;
}
};