leetcode 1319 连通网络的操作次数

前言

题目:1319. 连通网络的操作次数

参考题解:连通网络的操作次数-力扣官方题解


提交代码

熟悉并查集算法,这道题目很容易解决哒。

  • 当边数小于节点个数减一时,必然无法全部连通,返回-1。

  • 当边数大于等于节点个数减一时。计算存在的集合个数,返回集合个数减一。

#include <vector>
#include <iostream>

using namespace std;

class unionFind {
private:
    vector<int> parent;
    int cnt;
public:
    unionFind(int n){
        parent.resize(n);
        cnt = n;
        for(int i=0; i<n; i++)
            parent[i] = i;
    }

    int findRoot(int x){
        while(x != parent[x])
            x = parent[x];
        return x;
    }

    bool isConnect(int x, int y){
        int root_x = findRoot(x);
        int root_y = findRoot(y);
        return root_x == root_y;
    }

    void unionSet(int x, int y){
        int root_x = findRoot(x);
        int root_y = findRoot(y);
        if(root_x == root_y){
            ;
        }else{
            parent[root_x] = root_y;
            cnt--;
        }
    }

    int getCnt(void){
        return cnt;
    }
};

class Solution {
public:
    int makeConnected(int n, vector<vector<int>>& connections) {
        if(connections.size() < n-1) // 至少包含n-1条边,否则返回-1
            return -1;
        
        unionFind uf(n);
        for(auto conn : connections){
            uf.unionSet(conn[0],conn[1]);
        }

        return uf.getCnt()-1; // 返回集合数量-1
    }
};


int main(void){
    vector<vector<int>> connections = {{0,1},{0,2},{0,3},{1,2},{1,3}};
    int n = 6;
    Solution sol;
    cout<<sol.makeConnected(n,connections)<<endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

da1234cao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值