省份数量
题目描述:
解题方法:并查集
class UnionFindSet
{
public:
UnionFindSet(size_t n)
{
_ufs.resize(n, -1);
}
void Union(int x1, int x2)//x1和x2所在集合的合并
{
assert(x1 < _ufs.size());
assert(x2 < _ufs.size());
int root1 = FindRoot(x1);
int root2 = FindRoot(x2);
//如果本身在一个集合就不用合并,不在一个集合需要合并
if (root1 != root2)
{//合并
_ufs[root1] += _ufs[root2];
_ufs[root2] = root1;
}
}
int FindRoot(int x)//查找x所在集合的根
{
//双亲表示法:每个位置都存的是双亲的下标,根节点存的是负值
assert(x < _ufs.size());
while (_ufs[x] > 0)
{
x = _ufs[x];
}
return x;
}
size_t SetSize()
{
size_t n = 0;
//有多少个集合
for(size_t i = 0;i <_ufs.size();i++)
{
if(_ufs[i] < 0)
{
//有多少个根就有多少个集合
n++;
}
}
return n;
}
private:
std::vector<int> _ufs;
};
class Solution {
public:
int findCircleNum(vector<vector<int>>& isConnected) {
UnionFindSet ufs(isConnected.size());
for(size_t i = 0;i < isConnected.size();i++)
{
for(size_t j = 0;j < isConnected.size();j++)
{
if(isConnected[i][j] == 1)
{
//是相连城市
ufs.Union(i,j);//i,j合并
}
}
}
return ufs.SetSize();
}
};