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

文章目录

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

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

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

相关文章

斯特林发动机图纸尺寸_南昌教学模型订做,航空发动机模型_境海模型

首页 > 新闻中心发布时间&#xff1a;2020-11-08 13:57:07 导读&#xff1a;境海模型为您提供南昌教学模型订做,航空发动机模型的相关知识与详情&#xff1a; 曾经的沙盘模型一般只有模型自身&#xff0c;没有现代的视觉作用例如&#xff1a;灯火声音形象等动态的作用。景观…

C# 关于列表List<T>排序总结与整理

一、概述 SortedList 类代表了一系列按照键来排序的键/值对&#xff0c;这些键值对可以通过键和索引来访问。排序列表是数组和哈希表的组合。它包含一个可使用键或索引访问各项的列表。 如果您使用索引访问各项&#xff0c;则它是一个动态数组&#xff08;ArrayList&#xff0…

iOS给图片打水印,并将打过水印的图片生成到沙盒中

- (void)WaterImage{ UIImage *bgImage [UIImage imageNamed:"scene"]; // 上下文 : 基于位图(bitmap) , 所有的东西需要绘制到一张新的图片上去 // 1.创建一个基于位图的上下文(开启一个基于位图的上下文) // size : 新图片的尺寸 // opaq…

app inventor离线版_小鸡漫画app手机版下载_小鸡漫画好看的漫画手机版下载

小鸡漫画app手机版&#xff0c;是一款无限量看漫画的阅读软件。小鸡漫画app手机版为喜欢看漫画的用户带来超多好看、热门、经典的漫画集&#xff0c;在这里看漫画没有乱七八糟和漫画无关的东西打扰。小鸡漫画app手机版方便看漫画&#xff0c;让一个人的你不再孤单&#xff0c;午…

LeetCode 963. 最小面积矩形 II

文章目录1. 题目2. 解题1. 题目 给定在 xy 平面上的一组点&#xff0c;确定由这些点组成的任何矩形的最小面积&#xff0c;其中矩形的边不一定平行于 x 轴和 y 轴。 如果没有任何矩形&#xff0c;就返回 0。 示例 1&#xff1a; 输入&#xff1a;[[1,2],[2,1],[1,0],[0,1]…

C#中判断浮点数double/float是否相等

一、float型与零值比较的语句 if(x < -0.000001 && x > 0.000001) // !0 if(x > -0.000001 && x < 0.000001)// 0 二、float型与float型如何判断相等 浮点数的表示是不精确的&#xff0c;不能直接比较两个数是否完全相等&#xff0c;一般都是在…

树的存储结构(树的二叉链表(孩子—兄弟))

// c6-5.h 树的二叉链表(孩子—兄弟)存储结构(见图6.32) typedef struct CSNode {TElemType data;CSNode *firstchild,*nextsibling; }CSNode,*CSTree; 一棵树无论有多少叉&#xff0c;它最多有一个长子和一个排序恰在其下的兄弟。根据这样的定 义&#xff0c;则每个结点的结构…

C# 二维与三维计算多边形面积的方法

1、二维情况下&#xff0c;计算多边形面积 internal static float GetArea(List<Vector2> points) {float area2 0;for (int numPoint 0; numPoint < points.Count - 1; numPoint){MyPoint point points[numPoint];MyPoint nextPoint points[numPoint 1];area2 …

i12蓝牙耳机使用说明书图片_配置强悍、适用于开车、运动的蓝牙耳机Xisem西圣 Ares使用体验...

现在的蓝牙耳机市场五花八门、有降噪的、有高保真音质的、有适用于运动不掉的… … 真有是各出奇招。那么作为消费者应该如何选择呢&#xff1f;前段时间入手一款硬件配置很高、无论是开车&#xff0c;还是运动都适用的蓝牙耳机“Xisem西圣 Ares真无线蓝牙耳机”。包装简介&…

LeetCode 918. 环形子数组的最大和(前缀和+单调队列)

文章目录1. 题目2. 解题1. 题目 给定一个由整数数组 A 表示的环形数组 C&#xff0c;求 C 的非空子数组的最大可能和。 在此处&#xff0c;环形数组意味着数组的末端将会与开头相连呈环状。 &#xff08;形式上&#xff0c;当0 < i < A.length 时 C[i] A[i]&#xff0…

小案例:王者荣耀战力查询系统(免费调用外部接口

一、查询网址&#xff08;点击&#xff09;&#xff1a; 王者战力查询-王者战力排行榜 二、战力查询接口&#xff1a; 接口调用&#xff1a; https://www.jk.cxkf.cc/api_select.php参数&#xff1a; hero&#xff1a;英雄名字 type&#xff1a;qq、wx、ios_qq、ios_wxqq&…

open函数返回-1_4.6 linux的系统调用执行探究(1)

arm64大约支持280个系统调用&#xff0c;我们平时使用的这些系统调用&#xff0c;到底工作原理是什么&#xff0c;调用后又是到哪里实现的呢&#xff0c;这篇文章初步了解下内核系统调用的流程&#xff0c;并告诉跟踪这个流程的方法。废话不多说&#xff0c;如上就是linux的系统…

LeetCode 781. 森林中的兔子(哈希+贪心)

文章目录1. 题目2. 解题1. 题目 森林中&#xff0c;每个兔子都有颜色。 其中一些兔子&#xff08;可能是全部&#xff09;告诉你还有多少其他的兔子和自己有相同的颜色。 我们将这些回答放在 answers 数组里。 返回森林中兔子的最少数量。 示例: 输入: answers [1, 1, 2] 输…

4*4矩阵转换成二维平面坐标

一、需求&#xff1a;基于苹果数据4*4矩阵数据&#xff0c;转换成二维平面坐标系 二、解决方法与步骤&#xff1a; 用到的方法&#xff1a; 1、Matrix4的转化_Catirl的博客-CSDN博客 2、平面内直角坐标系中坐标旋转变换公式_Eric_Wangyz的博客-CSDN博客_坐标旋转变换公式 …

C#操作Excel(1)Excel对象模型

Excel对象模型 &#xff08;.Net Perspective&#xff09; 本文主要针对在Visual Studio中使用C# 开发关于Excel的应用程序 本文的PDF下载地址&#xff1a;C#操作Excel2007.pdf 来源&#xff1a;Understandingthe Excel Object Model from a .NET Developers Perspective Exce…

蓝牙适配器 能同时接多少个设备_便携音箱也能有立体环绕声,JVC智能蓝牙颈挂音箱体验...

说起音箱&#xff0c;相信音乐爱好者是很熟悉了&#xff0c;而随着蓝牙技术的不断发展&#xff0c;便携式蓝牙音箱开始受到越来越多用户的喜爱&#xff0c;它能够让我们摆脱线材束缚&#xff0c;随时随地畅享音乐。虽然便携式蓝牙音箱小巧易携带&#xff0c;音质方面也在不断提…

LeetCode 1156. 单字符重复子串的最大长度

文章目录1. 题目2. 解题1. 题目 如果字符串中的所有字符都相同&#xff0c;那么这个字符串是单字符重复的字符串。 给你一个字符串 text&#xff0c;你只能交换其中两个字符一次或者什么都不做&#xff0c;然后得到一些单字符重复的子串。 返回其中最长的子串的长度。 示例 …

☆☆在Eclipse中编译NDK的so文件(普通安卓项目转换为NDK项目的设定)

1 将Native的编译链接配置加入项目中 2 进行编译 3 项目支持Native后&#xff0c;在首尾分别新增了两个编译过程 转载于:https://www.cnblogs.com/YangBinChina/p/3937287.html

小案例:利用图床自动化批量上传图片并获取图片链接

一、前言&#xff1a; 用python爬虫写了一个小脚本&#xff0c;用来自动上传图片到图床&#xff0c;然后返回链接&#xff0c;我们只需直接复制链接就可以。&#xff08;需要安装Requests库&#xff09;因为不同图床需要提交的POST表单不一致&#xff0c;所以在这里我用ImgURL…

LeetCode 497. 非重叠矩形中的随机点(前缀和+二分查找)

文章目录1. 题目2. 解题1. 题目 给定一个非重叠轴对齐矩形的列表 rects&#xff0c;写一个函数 pick 随机均匀地选取矩形覆盖的空间中的整数点。 提示&#xff1a; 整数点是具有整数坐标的点。 矩形周边上的点包含在矩形覆盖的空间中。 第 i 个矩形 rects [i] [x1&#xff0…