首页 > 其他分享 >力扣1168水资源优化

力扣1168水资源优化

时间:2024-06-02 23:03:52浏览次数:29  
标签:setPrim int graph 1168 力扣 cost heap 水资源 节点

题目

这个题目首先有节点,有双向边,而且要求最少总成本,那么我们最先想到的应该是最小生成树。

算法逻辑 

在最小生成树中有一个prim算法,个人觉得是和dijkstra非常相似甚至一模一样的,基于贪心思想的一种算法。

prim的算法过程:首先找到一个一定存在的节点,然后从这个结点开始扩展MST,每一次扩展都是找到最小的节点,然后如果这个能去到的节点之前已经访问过了,那就直接进入下一轮迭代,否则就遍历这个节点能去到的所有节点,如果没有访问过就把节点压入优先队列,一遍下一轮的访问及扩展最小生成树。一直到所有节点都访问完成,这个时候循环结束,最小生成树也就拓展好了。

题目代码

typedef pair<int, int> PII;
class Solution {
public:
    int minCostToSupplyWater(int n, vector<int>& wells, vector<vector<int>>& pipes) {
        priority_queue<PII, vector<PII>, greater<PII>> heap;
        vector<vector<PII>> graph(n + 1);
        for (int i = 0; i < wells.size(); ++i) {
            graph[0].push_back({wells[i], i + 1});
            heap.push({wells[i], i + 1});
        }
        //创建虚拟节点,连接每一条边
        for (auto& x : pipes) {
            int house1 = x[0], house2 = x[1];
            int cost = x[2];
            graph[house1].push_back({cost, house2});
            graph[house2].push_back({cost, house1});
        }
        //链接每一条给出的边
        unordered_set<int> setPrim;
        setPrim.insert(0);
        //以虚拟节点为头节点创建最小生成树
        int ans = 0;
        //只要没放满n个就继续
        while (setPrim.size() < n + 1) {
            auto tmp = heap.top(); heap.pop();
            int cost = tmp.first;
            int idx = tmp.second;
            if (setPrim.count(idx)) continue;
            setPrim.insert(idx);
            ans += cost;
            for (auto& x : graph[idx]) {
                //没在集合里面里面就把这个能去的节点压入堆中
                if (!setPrim.count(x.second)) {
                    heap.push(x);
                }
            }
        }
        return ans;
    }
};

标签:setPrim,int,graph,1168,力扣,cost,heap,水资源,节点
From: https://blog.csdn.net/m0_74246669/article/details/139398707

相关文章

  • 力扣2891每日一题题解
    题目:给你一个仅由小写英文字母组成的字符串 s 。如果一个字符串仅由单一字符组成,那么它被称为 特殊 字符串。例如,字符串 "abc" 不是特殊字符串,而字符串 "ddd"、"zz" 和 "f" 是特殊字符串。返回在 s 中出现 至少三次 的 最长特殊子字符串 的长度,如果不存在出......
  • 力扣 2642. 设计可以求最短路径的图类 python AC
    朴素dijkstraclassGraph:def__init__(self,n,edges):self.n=nself.INF=float('inf')self.matrix=[[self.INF]*nfor_inrange(n)]foru,v,winedges:self.matrix[u][v]=wdefaddEdg......
  • 力扣 1题 两数之和(哈希) 记录
    题目描述给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例1:输入:nums=......
  • 深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
    在本篇文章中,我们将详细解读力扣第170题“两数之和III-数据结构设计”。通过学习本篇文章,读者将掌握如何设计一个数据结构来支持两种操作,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释和ASCII图解,以便于理解。问题描述力扣第170题“两数之和III......
  • 力扣刷題---回文數 擊敗100%用戶的解法
    題目:给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。示例1:输入:x=121输出:true示例 2:输入:x=-121输出:false解释:从左向右读,为-121。从右......
  • 力扣每日一题 5/31
    2965.找出缺失和重复的数字[简单] 题目:给你一个下标从 0 开始的二维整数矩阵 grid,大小为 n*n ,其中的值在 [1,n2] 范围内。除了 a 出现 两次,b 缺失 之外,每个整数都 恰好出现一次 。任务是找出重复的数字a 和缺失的数字 b 。返回一个下标从0开始、长......
  • 力扣--11.盛最多水的容器
    给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i,0) 和 (i,height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。示例1:输入:[1,8,6,2,5,4,8,3,......
  • Leetcode 力扣106. 从中序与后序遍历序列构造二叉树 (抖音号:708231408)
    给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。示例1:输入:inorder=[9,3,15,20,7],postorder=[9,15,7,20,3]输出:[3,9,20,null,null,15,7]示例2:输入:inorder=[......
  • Leetcode 力扣105. 从前序与中序遍历序列构造二叉树 (抖音号:708231408)
    给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。示例1:输入:preorder=[3,9,20,15,7],inorder=[9,3,15,20,7]输出:[3,9,20,null,null,15,7]示例2:输入:preorder......
  • 力扣:5. 最长回文子串
    5.最长回文子串给你一个字符串 s,找到 s 中最长的 回文子串。示例1:输入:s="babad"输出:"bab"解释:"aba"同样是符合题意的答案。示例2:输入:s="cbbd"输出:"bb"提示:1<=s.length<=1000s 仅由数字和英文字母组成classSolution{publicStringlonges......