文章目录

  • 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阿明),一起加油、一起学习进步!

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

  1. Leetcode 1135:最低成本联通所有城市(超详细的解法!!!)

    想象一下你是个城市基建规划者,地图上有 N 座城市,它们按以 1 到 N 的次序编号. 给你一些可连接的选项 conections,其中每个选项 conections[i] = [city1, cit ...

  2. [Swift]LeetCode1135. 最低成本联通所有城市 | Connecting Cities With Minimum Cost

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  3. LeetCode 1697. 检查边长度限制的路径是否存在(排序+并查集)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个 n 个点组成的无向图边集 edgeList ,其中 edgeList[i] = [ui, vi, disi] 表示点 ui 和点 vi 之间有一 ...

  4. Leetcode 1436旅行终点站 拓扑排序 并查集与队列

    题目介绍 题目难度: easy 给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示,其中 paths[i] = [cityAi, cityBi] 表示该线路将会从 cityAi 直接前往 ...

  5. 51nod1743-雪之国度【最小生成树,LCA,并查集】

    正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1743 题目大意 nnn个点mmm条边的一张图,每次询问要求找出x,yx, ...

  6. ssl1615-Frogger【图论,最小生成树,并查集】

    题目 给一个无向图,要求从点1到点2的一条路,要求这条路上的边的最大值尽量小. 输入输入 多组数据,每个数据n+1行,分别是n和点的坐标 2 0 0 3 4 3 17 4 19 4 18 5 0 输出 ...

  7. ssl2348-连接格点【图论,最小生成树,并查集】

    题目 有一个M行N列的点阵,相邻两点可以相连.一条纵向的连线花费一个单位,一条横向的连线花费两个单位.某些点之间已经有连线了,试问至少还需要花费多少个单位才能使所有的点全部连通. 输入 第一行输入两个 ...

  8. LeetCode 2076. 处理含限制条件的好友请求(并查集)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n ,表示网络上的用户数目.每个用户按从 0 到 n - 1 进行编号. 给你一个下标从 0 开始的二维整数数组 restrictions ...

  9. LeetCode 1258. 近义词句子(哈希+并查集+排序+回溯)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个近义词表 synonyms 和一个句子 text , synonyms 表中是一些近义词对 ,你可以将句子 text 中每个单词用它的近义词来替换 ...

最新文章

  1. VTK:可视化算法之LOxGrid
  2. 第十届 蓝桥杯样题 —— 信用卡号验证
  3. pc receiver2.0.3_【工控笔记】WINCC 7.4与博途V15.1仿真软件S7PLCSIM V15 通信
  4. web.config配置文件格式
  5. 异常 try – finally 注意的地方
  6. VS2013 MFC 直接将 OpenCV2.0/3.0 库中的 Mat 结构的图像传递到 Picture Control(图片控件)
  7. cenos安装erlang
  8. php-rabbitmq结合rabbitmq_delayed_message_exchange实现延时队列
  9. P2525 Uim的情人节礼物·其之壱
  10. 百度文库下载工具(所有源码)
  11. linux 系统添加字体,linux服务器下添加字体
  12. 【2019数学建模】国赛C题:机场出租车优化问题(原创)
  13. 像哆啦A梦懂大雄一样懂客户,我们也会拥有百宝箱
  14. 译体验|Qualtrics:客户体验的六大法则
  15. java版mc复制tnt,教程/方块和物品复制
  16. iOS解决UITableView头部和底部出现空白间隙的折腾
  17. Java获取时间几月第几周
  18. 开源网校系统+源代码分享
  19. tp框架部署阿里云服务器/宝塔面板
  20. 【IPD】IPD流程

热门文章

  1. Java笔记05-Collection、泛型、迭代器
  2. JavaScript中的运算符
  3. 牛顿插值--python实现
  4. 手机触摸屏的分类和原理,供大家选择手机时用
  5. 死锁产生的原因及条件、如何避免死锁
  6. 嵌入式Linux中的根文件系统
  7. 【51nod】1934 受限制的排列
  8. [Robot Framework] 怎么做数学运算?
  9. css 相对定位与绝对定位
  10. Orchard商城模块(Commerce)设计与后台部分