题目链接:https://leetcode.cn/problems/number-of-provinces/
题目描述:
解题思路:
其实就是求联通分量,咱们可以用bfs或者dfs跑,看几遍能跑完就有几个联通分量,也可以使用并查集。
BFS代码如下
class Solution {
public:
int bk[205];
queue<int>q;
int findCircleNum(vector<vector<int>>& isConnected) {
int n,m;
n=isConnected.size();
m=isConnected[0].size();
int ans=0;
for(int i=0;i<n;i++){
if(bk[i]==0){
ans++;
q.push(i);
bk[i]=1;
}
while(q.size()){
int k=q.front();
q.pop();
for(int i=0;i<m;i++){
if(isConnected[k][i]&&bk[i]==0){
bk[i]=1;
q.push(i);
}
}
}
}
return ans;
}
};
并查集代码如下:
class Solution {
public:
int fa[205];
set<int>p;
int getf(int q){
if(fa[q]==q) return q;
return fa[q]=getf(fa[q]);
}
void mer(int x,int y){
int newx=getf(x);
int newy=getf(y);
if(newx==newy) return ;
if(newx>newy){
fa[newy]=newx;
}else{
fa[newx]=newy;
}
}
int findCircleNum(vector<vector<int>>& isConnected) {
int n,m;
n=isConnected.size();
m=isConnected[0].size();
//cout<<n<<" "<<m<<endl;
for(int i=0;i<n;i++){
fa[i]=i;
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(isConnected[i][j]) mer(i,j);
}
}
int ans=1;
for(int i=0;i<n;i++){
//cout<<fa[i]<<" ";
p.insert(getf(fa[i]));
}
return p.size();
}
};