并查集

本文介绍了一种算法解决园区内大楼联网问题,通过计算每栋楼独立购买路由器和互相拉网线的最省成本,确保所有大楼都能联通上网。利用UF(并查集)数据结构,结合自定义的find和union操作,以及对边的费用排序,找到最优解决方案。
摘要由CSDN通过智能技术生成

【题目】园区里面有很多大楼,编号从 1~N。第 i 大楼可以自己花钱买路由器上网,费用为 cost[i-1],也可以从别的大楼拉一根网线来上网,比如大楼 a 和大楼 b 之间拉网线的费用为 c,表示为一条边 [a, b, c]。输入为每个大楼自己买路由器和拉网线的费用,请问,让所有大楼都能够上网的最小费用是多少?上网具有联通性,只要与能够上网的大楼连通,即可上网。

输入:cost = [1, 2, 3], edges = [[1,2,100], [2,3,3]]

输出:6

 

class UF  {
    
    
public:
    vector<int>F;
    int totoalCost = 0;
    vector<int> Cnt;
    UF(int n){
        F.resize(n);
        for (int i =0; i < n; i++) {
            F[i] = i;
        }
        totoalCost = 0;
    }
    
    int Find(int x) {
        return x == F[x] ? x : F[x] = Find(F[x]);
    }
    
    void Union(int x, int y, int cost){
        int xpar = Find(x);
        int ypar = Find(y);
        if (xpar != ypar) {
            F[xpar] = ypar;
            totoalCost += cost;
        }
    }
};

class Solution4 {
    // N 表示结点数目
      // cost[i-1]表示结点i自己买路由器的代价
      // es[x] = [a, b, c]表示大楼a,b之间拉网线的费用
      // 输出所有大楼通网的最小费用
    
public:
    int minCostToSupplyWater(int N, vector<int> &cost, vector<vector<int>> &es){
        
        UF uf(N +1);
        // 每个结点都要自己挖水,那么我们可以认为这样
        // 0号楼已经有网络了,可以用0费用上网
        // i号楼与0号楼拉网线,需要的费用是cost[i-1]
        // 那么这里就多了N条边
        
        for (int i =0; i <=N; i++) {
            vector<int>tmp {0,i,cost[i-1]};
            es.push_back(tmp);
        }
        
        sort(es.begin(), es.end(), [](const vector<int>&a, const vector<int> &b){
            return  a[2] < b[2];
        });
        
        for (auto &e : es) {
            uf.Union(e[0], e[1], e[2]);
        }
        
        return uf.totoalCost;;
    }
    
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值