解决代码:
class Solution {
public:
vector<int> a;
vector<int> h;
int num=0;
void unionfind(int n)
{
for(int i=0;i<n;i++)
{
a.push_back(i);
h.push_back(0);
num++;
}
}
int find(int x)
{
return x==a[x] ? x : a[x]=find(a[x]);
}
void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x==y) return ;
else
{
if(h[x]<h[y])
{
a[x]=y;
}
else
{
a[y]=x;
if(h[x]==h[y]) h[x]++;
}
num--;
}
}
int findCircleNum(vector<vector<int>>& isConnected)
{
int m=isConnected.size();//m行m列
unionfind(m);
for(int i=0;i<m;i++)
{
for(int j=0;j<i;j++)
{
if((i!=j)&&isConnected[i][j]==1) unite(i,j);
}
}
return num;
}
};
可以看到省份由图的邻接矩阵存储,本题求图的连通分量个数。
可以利用并查集解决,当isConnected[i][j]==1
两个元素相邻就合并,因为无向图的邻接矩阵是对称的,所以只需要遍历半个矩阵即可。
最终连通分量的个数为总元素个数-元素合并的次数。