题目
原题链接:力扣(LeetCode)#1319
解析
并查集模板题。
需要注意的是N个连通分量,至少需要N-1条边进行连接。
最开始将每个节点视为一个连通分量,如果进行了合并就将连通分量的数量减少一个,否则继续判断。当遍历完connections的时候,如果还剩余K个连通分量,那么至少还需要K-1条边,K-1也就是答案。
代码(含注释)
class Solution {
//n个连通分量至少需要n-1条线
private:
int *a;
int cnt;//当前剩余连接的电脑数
public:
int makeConnected(int n, vector<vector<int>>& connections) {
if(n>connections.size()+1)//首先判断是否可以全部连接
return -1;
cnt=n;
a=new int[n];
init(n);
for(int i=0;i<connections.size();i++)
{
merge(connections[i][0],connections[i][1]);
}
return cnt-1;
}
void init(int n)
{
for(int i=0;i<n;i++)
{
a[i]=i;
}
}
int find(int var)
{
if(var==a[var])
return var;
else
{
return a[var]=find(a[var]);//路径压缩
}
}
void merge(int x, int y)
{
int a1=find(x);
int a2=find(y);
if(a1!=a2)
{
a[a1]=a2;
cnt--;
}
}
};