文章目录

  • 1. 题目
  • 2. 解题

1. 题目

给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1 ,同时还有一个数组 edges ,其中 edges[i] = [fromi, toi, weighti] 表示在 fromi 和 toi 节点之间有一条带权无向边。

最小生成树 (MST) 是给定图中边的一个子集,它连接了所有节点且没有环,而且这些边的权值和最小。

请你找到给定图中最小生成树的所有关键边和伪关键边。

  • 如果从图中删去某条边,会导致最小生成树的权值和增加,那么我们就说它是一条关键边。
  • 伪关键边则是可能会出现在某些最小生成树中但不会出现在所有最小生成树中的边。

请注意,你可以分别以任意顺序返回关键边的下标和伪关键边的下标。

示例 1:

输入:n = 5, edges = [[0,1,1],[1,2,1],[2,3,2],[0,3,2],[0,4,3],[3,4,3],[1,4,6]]
输出:[[0,1],[2,3,4,5]]

解释:上图描述了给定图。
下图是所有的最小生成树。

注意到第 0 条边和第 1 条边出现在了所有最小生成树中,所以它们是关键边,我们将这两个下标作为输出的第一个列表。
边 2,3,4 和 5 是所有 MST 的剩余边,所以它们是伪关键边。我们将它们作为输出的第二个列表。

示例 2 :

输入:n = 4, edges = [[0,1,1],[1,2,1],[2,3,1],[0,3,1]]
输出:[[],[0,1,2,3]]
解释:可以观察到 4 条边都有相同的权值,
任选它们中的 3 条可以形成一棵 MST 。所以 4 条边都是伪关键边。提示:
2 <= n <= 100
1 <= edges.length <= min(200, n * (n - 1) / 2)
edges[i].length == 3
0 <= fromi < toi < n
1 <= weighti <= 1000
所有 (fromi, toi) 数对都是互不相同的。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-critical-and-pseudo-critical-edges-in-minimum-spanning-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

图–最小生成树
并查集参考

  • 解题见注释
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), fb = find(b);if(fa != fb){f[fa] = fb;}}int find(int a){if(a == f[a]) return a;return f[a] = find(f[a]);}void reset(){for(int i = 0; i < f.size(); ++i)f[i] = i;}
};
class Solution {public:vector<vector<int>> findCriticalAndPseudoCriticalEdges(int n, vector<vector<int>>& edges) {vector<int> edgeId(edges.size());iota(edgeId.begin(), edgeId.end(), 0);sort(edgeId.begin(), edgeId.end(),[&](auto a, auto b){return edges[a][2] < edges[b][2];//距离小的优先});dsu u(n);vector<bool> vis(edges.size(), false);int mincost = kruskal(vis, u, edgeId, edges, n, 0);//最小生成树权值vector<vector<int>> ans(2);for(int i = 0; i < edges.size(); ++i){vis[i] = true;//删除这条边u.reset();//重置并查集int cost = kruskal(vis, u, edgeId, edges, n, 0);if(cost > mincost)//删除边以后,cost 变大,或 无法生成树{ans[0].push_back(i);//关键边vis[i] = false;continue;}u.reset();//重置并查集u.merge(edges[i][0], edges[i][1]);//不是关键边,且提前把这条边加入树中cost = kruskal(vis, u, edgeId, edges, n, edges[i][2]);if(cost == mincost)// 权值和 不变,伪关键边ans[1].push_back(i);vis[i] = false;//恢复这条边}return ans;}int kruskal(vector<bool>& vis, dsu& u, vector<int>& edgeId, vector<vector<int>>& edges, int n, int mincost){int edge_count = (mincost ? 1 : 0);//提前加入边了吗int a, b, id, cost;for(int i = 0; i < edgeId.size(); ++i){id = edgeId[i];if(vis[id]) continue;//边删除了a = edges[id][0];b = edges[id][1];cost = edges[id][2];if(u.find(a) != u.find(b)){u.merge(a, b);mincost += cost;edge_count++;}if(edge_count == n-1)return mincost;}return INT_MAX;//无法构造生成树}
};

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

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

LeetCode 1489. 找到最小生成树里的关键边和伪关键边(并查集+kruskal最小生成树)相关推荐

  1. leetcode 1489. 找到最小生成树里的关键边和伪关键边(并查集)

    给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1 ,同时还有一个数组 edges ,其中 edges[i] = [fromi, toi, weighti] 表示在 fromi 和 toi ...

  2. 每日一题:leetcode1489. 找到最小生成树里的关键边和伪关键边

    时隔多年我终于又开始写博客了,主要是已经放假了,之前一直忙于考试和课设没有时间写博客,学习笔记也因为买了iPad的缘故大部分都是手写的了. 假期想要把以前做过的项目都整理一下放在github和CSDN ...

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

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

  4. mst算法matlab_基于并查集+Kruskal算法的matlab程序及最小生成树绘图

    学了一天最小生成树,稍稍总结一下,这是第一篇 kruskal算法 关于kruskal算法已有大量的资料,不再赘述,算法流程为: 得到邻接矩阵和权值: 初始化,连接距离最小的两点: 连接距离次小的两点, ...

  5. LeetCode 947. 移除最多的同行或同列石头(并查集)

    1. 题目 我们将石头放置在二维平面中的一些整数坐标点上.每个坐标点上最多只能有一块石头. 每次 move 操作都会移除一块所在行或者列上有其他石头存在的石头. 请你设计一个算法,计算最多能执行多少次 ...

  6. POJ2560-雀斑(Freckles)【图论,并查集,最小生成树,KURUSKAL】

    正题 题目链接: http://poj.org/problem?id=2560 大意 有n个点,给出坐标,求连接这n个点的最短路线 解题思路 KURUSKAL算法求最小生成树. 代码 #include ...

  7. 【代码源 Div1 - 109】#454. Minimum Or Spanning Tree(最小生成树,边权按位或,贪心,并查集) CF1624G

    problem solution 题意:生成树的代价为他所有边的边权按位或得到的值,求最小生成树 贪心,一般来说,求 按位与 和 按位或 的最大值都可以从高往低逐位的贪心处理 对于当前位 b 而言,若 ...

  8. Kruscal算法+并查集 求解最小生成树

    http://ac.jobdu.com/problem.php?pid=1347    孤岛连通工程 刚开始的时候使用qsort排序函数进行排序提交一直都是TLE,后来无意中改为sort排序函数提交就 ...

  9. leetcode:2382. 删除操作后的最大子段和【逆向思维 + 并查集困难题 + 细节不懂】

    分析 一个个删很难受 可以反过来一个个加 然后加的话回导致合并,所以用并查集 把当前的x和x + 1合并起来 更新每一段的和,把和聚集到find(x + 1)的这个代表元这里 ac code clas ...

最新文章

  1. 4、kubernetes 集群管理工具 kubectl
  2. jmeter插件 --PerfMon Metrics Collector监控工具的使用
  3. 中科微研携手-农业大健康·李喜贵:从玉农业谋定功能性农业
  4. 重复制造和离散制造特点
  5. Python枚举类型的使用
  6. 收藏!2021最新期刊预警名单汇总!
  7. Thymeleaf——使用模板动态生成JavaScript脚本文件
  8. [Javascript] Avoid Creating floats if they are not needed
  9. Qt图形界面编程入门(7)
  10. SpringBoot配置logback-spring.xml日志
  11. python消费kafka逻辑处理导致cpu升高_爬虫架构|利用Kafka处理数据推送问题(1)
  12. 深度图像RGB-D(RGB+Depth Map)名词扫盲笔记
  13. python凯撒密码实验报告_凯撒密码的python实现
  14. http://jingyan.baidu.com/article/a3761b2b66fe141577f9aa51.html
  15. mvn assembly:single打包报错:Error reading assemblies: No assembly descriptors found.
  16. 2022年最新春招作战表…
  17. 网易我的世界中国版服务器存档文件在哪里,网易我的世界怎么导入存档 网易中国版手游存档位置...
  18. 网络编程中的SO_REUSEADDR和SO_REUSEPORT参数详解
  19. [病毒分析]熊猫烧香
  20. RISC-V矢量指令集学习记录

热门文章

  1. 【MySQL】基于Docker的Mysql主从复制搭建
  2. $.ajax 同步一不,ajax 同步不生效
  3. Linux:I/O多路转接之select(有图有代码有真相!!!)
  4. uboot源码——命令体系
  5. 保护可执行程序的一种方法
  6. Docker swarm 实战-部署wordpress
  7. 日志配置(springboot、mybatis、Lombok)
  8. UVALive 4394 String painter
  9. 书店售书最低价格问题
  10. 多个域名向主域名自动跳转的Nginx配置