遍历所有连接,如果发现节点没有连接,就将节点连接,如果已经连接了则不用连且此时可用连接数++,最后统计下并查集中所有根节点。然后输出答案。
class Union{
private:
vector<int> p;
int n;
public:
Union(int n){
this->n = n;
p.resize(n);
for(int i=0;i<n;i++) p[i] = i;
}
int find(int x){
if(p[x]!=x) p[x] = find(p[x]);
return p[x];
}
void unite(int x, int y){
p[find(x)] = find(y);
}
bool isUnite(int x, int y){
return find(x) == find(y);
}
};
class Solution {
public:
int makeConnected(int n, vector<vector<int>>& connections) {
int res = 0,count = 0;
Union un(n);
for(auto connection:connections){
if(!un.isUnite(connection[0],connection[1])){
un.unite(connection[0],connection[1]);
}else{
count++;
}
}
unordered_set<int> root;
for(int i=0;i<n;i++){
root.insert(un.find(i));
}
return (count>=root.size()-1?root.size()-1:-1);
}
};