Leetcode 1319. 连通网络的操作次数 (贪心思想加并查集)

遍历所有连接,如果发现节点没有连接,就将节点连接,如果已经连接了则不用连且此时可用连接数++,最后统计下并查集中所有根节点。然后输出答案。

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);
    }
};

猜你喜欢

转载自blog.csdn.net/wwxy1995/article/details/113015835