LeetCode 1135. 最低成本联通所有城市(最小生成树+排序+并查集)

文章目录

    • 1. 题目
    • 2. 解题
      • 1. Kruskal
      • 2. prim

1. 题目

想象一下你是个城市基建规划者,地图上有 N 座城市,它们按以 1 到 N 的次序编号。

给你一些可连接的选项 conections,其中每个选项 conections[i] = [city1, city2, cost] 表示将城市 city1 和城市 city2 连接所要的成本。(连接是双向的,也就是说城市 city1 和城市 city2 相连也同样意味着城市 city2 和城市 city1 相连)。

返回使得每对城市间都存在将它们连接在一起的连通路径(可能长度为 1 的)最小成本
该最小成本应该是所用全部连接代价的综合。如果根据已知条件无法完成该项任务,则请你返回 -1。

示例 1:
在这里插入图片描述

输入:N = 3, conections = [[1,2,5],[1,3,6],[2,3,1]]
输出:6
解释:
选出任意 2 条边都可以连接所有城市,我们从中选取成本最小的 2 条。

示例 2:
在这里插入图片描述

输入:N = 4, conections = [[1,2,3],[3,4,4]]
输出:-1
解释: 
即使连通所有的边,也无法连接所有城市。提示:
1 <= N <= 10000
1 <= conections.length <= 10000
1 <= conections[i][0], conections[i][1] <= N
0 <= conections[i][2] <= 10^5
conections[i][0] != conections[i][1]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/connecting-cities-with-minimum-cost
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

图Graph–最小生成树

1. Kruskal

  • 将边的权值排序,小的先遍历,用并查集检查两个顶点是否合并了,没有合并则将该边加入生成树
  • 也可以使用优先队列实现(相当于排序)
class dsu
{vector<int> f;
public:dsu(int n){f.resize(n);for(int i = 0; i < n; ++i)f[i] = i;}void merge(int a, int b){int fa = find(a);int fb = find(b);f[fa] = fb;}int find(int a){int origin = a;while(a != f[a]){a = f[a];}return f[origin] = f[a];}
};class Solution {
public:int minimumCost(int N, vector<vector<int>>& connections) {dsu u(N+1);sort(connections.begin(), connections.end(),[&](auto a, auto b){return a[2] < b[2];//距离短的边优先});int edge = 0, p1, p2, dis, total = 0;for(int i = 0; i < connections.size(); ++i){p1 = connections[i][0];p2 = connections[i][1];dis = connections[i][2];if(u.find(p1) != u.find(p2))//两个还未链接{u.merge(p1,p2);edge++;total += dis;}if(edge == N-1)break;}return edge==N-1 ? total : -1;}
};

1504 ms 158.6 MB

2. prim

  • 把一个初始顶点的所有边加入优先队列
  • 取出最短的边,把这条边的另一个顶点相关的边加入队列
  • 再取出最小的边,重复下去,直到所有顶点加入过了
struct cmp
{bool operator()(const pair<int,int>& a, const pair<int,int>& b) const{return a.second > b.second;//小顶堆, 距离小的优先}
};
class Solution {
public:int minimumCost(int N, vector<vector<int>>& connections) {vector<bool> vis(N+1, false);vector<vector<pair<int,int>>> edges(N+1,vector<pair<int,int>>());for(auto& c : connections){edges[c[0]].push_back({c[1],c[2]});edges[c[1]].push_back({c[0],c[2]});}priority_queue<pair<int,int>, vector<pair<int,int>>, cmp> q;int to, distance, total = 0, edge = 0;vis[1] = true;for(auto& e : edges[1])q.push(e);           while(!q.empty()){to = q.top().first;distance = q.top().second;q.pop();if(!vis[to]){vis[to] = true;total += distance;edge++;if(edge == N-1)return total;for(auto& e : edges[to])q.push(e);           }}return -1;}
};

492 ms 40.9 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中的下标索引

所谓“下标”&#xff0c;就是编号&#xff0c;就好比超市中的存储柜的编号&#xff0c;通过这个编号就能找到相应的存储空间。字符串实际上就是字符的数组,也支持下标索引.如果有字符串:name abcdef&#xff0c;在内存中的实际存储如下:如果想取出部分字符&#xff0c;那么可…

android 视频转字节,如何将视频文件(.mp4)格式转换为android中的二进制格式?...

我想在网络服务器上传视频。我得到了我想要以二进制格式传递文件的服务&#xff0c;我该怎么做&#xff1f;如何将视频文件(.mp4)格式转换为android中的二进制格式&#xff1f;我试图通过base64将视频文件转换为二进制格式..&#xff1f;public class binaryformat extends Act…

python中的切片以及注意事项

切片是指对操作的对象截取其中一部分的操作。字符串、列表、元组都支持切片操作。字符串&#xff1a;[起始:结束:步长] 注意&#xff1a;选取的区间属于左闭右开型&#xff0c;即从"起始"位开始&#xff0c;到"结束"位的前一位结束&#xff08;不包含结束位…

LeetCode 1057. 校园自行车分配(map有序+贪心)

文章目录1. 题目2. 解题1. 题目 在由 2D 网格表示的校园里有 n 位工人&#xff08;worker&#xff09;和 m 辆自行车&#xff08;bike&#xff09;&#xff0c;n < m。所有工人和自行车的位置都用网格上的 2D 坐标表示。 我们需要为每位工人分配一辆自行车。在所有可用的自…

python中的字符串操作及注意事项

1.mystr.find(str, start0, endlen(mystr)) 检测str是否包含在mystr中,如果是返回开始的索引值,否则返回-1.mystr.rfind(str, start0,endlen(mystr) ) 类似于find()函数&#xff0c;不过是从右边开始查找.2.mystr.index(str, start0, endlen(mystr)) 跟f…

linux配ipv6 ipv4 双栈,RouterOS配置原生IPv6(电信IPv4/IPv6双栈)

无意中发现江苏(苏州)电信的原生IPv6改为有状态的IPv6&#xff0c;那么我使用的RouterOS软路由(以下简称ROS)就可以获取到IPv6的地址了&#xff0c;所以又可以折腾了一波。一、IPv6介绍IPv6的地址共有128位&#xff0c;也就是IPv6地址总量一共有2的128次方个地址。/32、/48是IP…

java mail 设置参数

Session需要使用java.util.Properties来构造&#xff0c;常用的用来构造Session的属性&#xff1a; 属性名 含义 mail.smtp.user SMTP的缺省用户名。 mail.smtp.host 要连接的SMTP服务器。 mail.smtp.port 要连接的SMTP服务器的端口号&#xff0c;如果connect没有指明端口号就使…

LeetCode 555. 分割连接字符串

文章目录1. 题目2. 解题1. 题目 给定一个字符串列表&#xff0c;你可以将这些字符串连接成一个循环字符串&#xff0c;对于每个字符串&#xff0c;你可以选择是否翻转它。 在所有可能的循环字符串中&#xff0c;你需要分割循环字符串&#xff08;这将使循环字符串变成一个常规…

libusb android pc,libusb

# libusb[![Build Status](https://travis-ci.org/libusb/libusb.svg?branchmaster)](https://travis-ci.org/libusb/libusb)[![Build status](https://ci.appveyor.com/api/projects/status/xvrfam94jii4a6lw?svgtrue)](https://ci.appveyor.com/project/LudovicRousseau/li…

LeetCode 314. 二叉树的垂直遍历(BFS/DFS)

文章目录1. 题目2. 解题2.1 DFS2.2 BFS1. 题目 给定一个二叉树&#xff0c;返回其结点 垂直方向&#xff08;从上到下&#xff0c;逐列&#xff09;遍历的值。 如果两个结点在同一行和列&#xff0c;那么顺序则为 从左到右。 示例 1&#xff1a; 输入: [3,9,20,null,null,15…

python中的元组及注意事项

与列表类似&#xff0c;元组也是由任意类型元素组成的序列。与列表不同的是&#xff0c;元组是不可改变&#xff0c;这意味着一旦元组被定义&#xff0c;将无法再进行增加、删除或修改元素等操作。因此&#xff0c;元组就像一个不可改变的列表。在许多地方元组都可以替换列表&a…

Android 利润,惊人利润:Android系统免费背后影藏的巨大利润

Android用户群体的庞大数量有目共睹&#xff0c;并且Android一直以免费为噱头&#xff0c;如果是一直免费&#xff0c;那么Android背后庞大的团队是靠什么经济来源支撑着Android一代又一代的更新&#xff1f;近日有网友披露谷歌的Android系统已经创造了310亿美元的营收&#xf…

LeetCode 336. 回文对(哈希map/Trie树)

文章目录1. 题目2. 解题2.1 哈希map2.2 Trie树1. 题目 给定一组唯一的单词&#xff0c; 找出所有不同 的索引对(i, j)&#xff0c;使得列表中的两个单词&#xff0c; words[i] words[j] &#xff0c;可拼接成回文串。 示例 1: 输入: ["abcd","dcba",&qu…

链接

Qt下载&#xff1a;http://qt-project.org/downloads/ Qt Creator中无法使用OpenCV2中新函数的解决办法: http://blog.csdn.net/masikkk/article/details/8748865 自建CDN技术选型: squid varnish nginx: http://www.linuxde.net/2013/05/13492.html转载于:https://www.cnblogs…

python中的常见的列表操作及注意事项

1.1 使用append()添加元素到尾部传统的向列表中添加元素的方法是利用append()函数将元素一个个添加到尾部。1.2 使用extend()或合并列表使用extend()可以将一个列表合并到另一个列表中&#xff0c;我们也可以使用.1.3 使用insert()在指定位置插入元素append()函数只能将新元素插…

Android8.0一键root,小米Mix 2(安卓8.0)一键ROOT详解教程,看教程ROOT

伴随着安卓刷机越来越流行&#xff0c;很多安卓用户都喜欢上了这种可以自定个性系统的行为&#xff0c;那么小米Mix 2(安卓8.0)怎么获取ROOT权限?小米Mix 2(安卓8.0)一键ROOT过程如何操作呢?奇兔小编在此大家说一说1.首先打开奇兔刷机软件&#xff0c;插好数据线&#xff0c;…

python中的列表及注意事项

目录 1、列表概念 2、列表创建 3、使用[]获取元素 4、列表嵌套&#xff1a; 1、列表概念 列表非常适合利用顺序和位置定义某一个元素&#xff0c;尤其是当元素的顺序或内容经常发生改变的时候。与字符串不同&#xff0c;列表中元素的值是可以修改的。我们可以直接对列表中进行添…

一周小记(六)

想要写的东西很多&#xff0c;目前只有这个坚持下来了 才第6周&#xff0c;前方的路还很长&#xff0c;能坚持3个月么&#xff0c;能坚持半年么&#xff0c;能坚持一年么&#xff0c;拭目以待 本周是五一假期周&#xff0c;只上了一天班 最近的工作中体现了一个问题&#xff0c…

刷机后如何升级android,手机系统怎么升级 三大方法大全【图文】

最近小编收到网友的问题&#xff0c;提到安卓手机系统怎么升级。对于这个问题&#xff0c;小编可是绞尽脑汁在网络上查找了好多资料&#xff0c;通过查阅资料&#xff0c;小编发现安卓系统升级多数是手机自动升级、或者通过手机自带的软件商店下载升级包。小编觉得这两种种方法…