Kruskal算法求最小生成树(kruskal算法)

题目描述

给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环,边权可能为负数。

求最小生成树的树边权重之和,如果最小生成树不存在则输出 impossible

给定一张边带权的无向图 G=(V,E),其中 V 表示图中点的集合,E 表示图中边的集合,n=|V|,m=|E|。

由 V 中的全部 n 个顶点和 E 中 n−1 条边构成的无向连通子图被称为 G 的一棵生成树,其中边的权值之和最小的生成树被称为无向图 G 的最小生成树。

输入格式

第一行包含两个整数 n 和 m。

接下来 m 行,每行包含三个整数 u,v,w,表示点 u 和点 v 之间存在一条权值为 w 的边。

输出格式

共一行,若存在最小生成树,则输出一个整数,表示最小生成树的树边权重之和,如果最小生成树不存在则输出 impossible

数据范围

1≤n≤10^5,
1≤m≤2∗10^5,
图中涉及边的边权的绝对值均不超过 1000。

输入样例:
4 5
1 2 1
1 3 2
1 4 3
2 3 2
3 4 4
输出样例:
6

算法思路:

将所有边按照权值的大小进行升序排序,然后从小到大一一判断。

如果这个边与之前选择的所有边不会组成回路,就选择这条边分;反之,舍去。

直到具有 n 个顶点的连通网筛选出来 n-1 条边为止。

筛选出来的边和所有的顶点构成此连通网的最小生成树。

判断是否会产生回路的方法为:使用并查集。

在初始状态下给各个个顶点在不同的集合中。

遍历过程的每条边,判断这两个顶点的是否在一个集合中。

如果边上的这两个顶点在一个集合中,说明两个顶点已经连通,这条边不要。如果不在一个集合中,则要这条边。

当我们遍历完了所有的边,得到的生成树的边数是n-1,则满足最小生成树。

我们使用结构体存储每条边。并且在从小到大排序边权重时使用sort函数,这就要用到<运算符重载。

示例代码:

#include<iostream>
#include<algorithm>
using namespace std;const int N=1e5+10,M=2e5+10,INF=0x3f3f3f3f;
int n,m;
int p[N];//思路:按权值从小到大排序边,如果这条边与之前的边不会形成回路就选择这条边,直到找到最小生成树:遍历了图里的n个顶点和n-1条边
//我们使用并查集来判断是否产生回路,一开始各顶点在不同的集合中,遍历每条边,判断它的两个顶点是否在一个集合里面,如果在的话说明两个点之前连通了(通过其他的点),如果不在就选择这条边
struct Edge
{int a,b,w;bool operator< (const Edge &W)const  //按权重排序,括号中的const表示参数W对象不会被修改,最后的const表明调用函数对象不会被修改{return w<W.w;  //w是调用的对象,W.w是和它比较的,比如K<J,就是K.w<J.w}
}edges[M];int find(int x) //并查集找祖宗节点
{if(x!=p[x]) p[x]=find(p[x]); //路径压缩+找祖宗节点return p[x];
}int kruskal()
{sort(edges,edges+m);  //所有边按权重从小到大排序,sort函数会用到重载的<for(int i=1;i<=n;i++) //初始化并查集{p[i]=i;}int res=0,cnt=0;for(int i=0;i<m;i++) //遍历所有边{int a=edges[i].a, b=edges[i].b, w=edges[i].w;a=find(a),b=find(b);  //找到两个点的祖宗节点if(a!=b) //两个点不在同一个集合中,说明它们还没有连通,这条边可以加入到生成树里面{p[a]=b; //把这两个点加入集合,要注意是p[b]=a或者p[a]=b,不要写成a=p[b],因为后者是把p[b]赋值给a,无意义,我们要改变的是集合的祖宗节点也就是p[]res+=w; //这条边加入最小生成树cnt++;  //统计的边加一}}if(cnt!=n-1) return INF; //如果最小生成树的边不为n-1条边,则不能连通return res;
}
int main()
{scanf("%d%d",&n,&m);for(int i=0;i<m;i++) //输入所有边{int a,b,w;scanf("%d%d%d",&a,&b,&w);edges[i]={a,b,w};}int t=kruskal();if(t==INF) puts("impossible");else printf("%d\n",t);return 0;
}
特别注意:
if(a!=b) //两个点不在同一个集合中,说明它们还没有连通,这条边可以加入到生成树里面{p[a]=b; //把这两个点加入集合,要注意是p[b]=a或者p[a]=b,不要写成a=p[b],因为后者是把p[b]赋值给a,无意义,我们要改变的是集合的祖宗节点也就是p[]res+=w; //这条边加入最小生成树cnt++;  //统计的边加一}

这一段代码不要写成下面这样子:

if(a!=b) //两个点不在同一个集合中,说明它们还没有连通,这条边可以加入到生成树里面{b=p[a]; //把这两个点加入集合,要注意是p[b]=a或者p[a]=b,不要写成a=p[b],因为后者是把p[b]赋值给a,无意义,我们要改变的是集合的祖宗节点也就是p[]res+=w; //这条边加入最小生成树cnt++;  //统计的边加一}

我们要做的是合并集合,也就是a的祖宗节点的父节点指向b的祖宗节点,如果颠倒了顺序,那么p[a]就不会发生改变,也就是说a的祖宗节点的父节点依然是它自己,没有完成和b的祖宗节点的合并。会报错的。 

参考:AcWing 859. Kruskal算法求最小生成树---海绵宝宝来喽 - AcWing

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

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

相关文章

【操作系统】探究进程奥秘:显示进程列表的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;Linux专栏&#xff1a;《探秘Linux | 操作系统解密》⏰诗赋清音&#xff1a;月悬苍穹泛清辉&#xff0c;梦随星河徜徉辉。情牵天际云千层&#xff0c;志立乘风意自飞。 ​ 目录 &a…

OpenCV之图像匹配与定位

利用图像特征的keypoints和descriptor来实现图像的匹配与定位。图像匹配算法主要有暴力匹配和FLANN匹配&#xff0c;而图像定位是通过图像匹配结果来反向查询它们在目标图片中的具体坐标位置。 以QQ登录界面为例&#xff0c;将整个QQ登录界面保存为QQ.png文件&#xff0c;QQ登…

cmake官方demo学习整理

文章目录 cmake官方demo学习整理概述整理后的CMakeDemo目录结构主工程CMakeLists.txtconfig.h.inmain.cppREADME.txtDLL工程CMakeLists.txtmy_math.cppmy_math.hmy_math.def备注END cmake官方demo学习整理 概述 想将iconv编译进自己的DLL, 顺便学了一下用CMake来构建工程. CM…

IDEA2023版如何创建web项目

一、新建项目 点击File->New->Project...&#xff0c;如果是第一次创建项目则单击New Project 二、添加Web Application 建好的样子 把web移动到main目录下同时改名为webapp 三、不存在Add Framework Support添加Web Application 如何存在Add Framework Support&#x…

运维工程师的出路揭秘:跨越35岁半衰期,探寻职业发展新路径

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆云计算学堂 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 目录 写在前面 本章主题 一.35岁被称为运维半衰期…

800+顶尖架构师齐聚深圳,第十届GIAC全球互联网架构大会,分享行业前沿视角与技术架构落地实践思考!(附:大会核心PPT下载)

2023年6月30-7月1日&#xff0c;由MSUP与高可用架构社区、深圳市软件行业协会联合主办的GIAC全球互联网架构大会在深圳华侨城洲际酒店圆满落幕。 本届大会邀请到了阿里、美图、腾讯、字节跳动、顺丰、华为、快手、B站等多个行业的近百位一线架构师、技术专家&#xff0c;围绕AI…

类加载器及其类加载子系统

类加载器子系统作用 类加载器子系统的作用是负责将字节码文件加载到内存中&#xff0c;并将其转化为能够被虚拟机直接使用的形式。它是Java虚拟机的一部分&#xff0c;具体作用如下&#xff1a; 加载 类加载器负责将类的字节码文件加载到虚拟机的方法区中&#xff0c;以便…

插入损耗 insertion loss

插入损耗 insertion loss 引言正文计算公式示例引言 这里给大家介绍一下,波导中插入损耗的计算公式以及一个示例。 正文 计算公式 I L = 10 log ⁡ ( P i P

L1-061:新胖子公式

题目描述 根据钱江晚报官方微博的报导&#xff0c;最新的肥胖计算方法为&#xff1a;体重(kg) / 身高(m) 的平方。如果超过 25&#xff0c;你就是胖子。于是本题就请你编写程序自动判断一个人到底算不算胖子。 输入格式&#xff1a; 输入在一行中给出两个正数&#xff0c;依次为…

前端面试题css

CSS CSS 属性是否区分大小写&#xff1f; CSS 属性名和属性值在大多数情况下是不区分大小写的&#xff0c;但也有少数例外情况&#xff0c;如 font-variant 和 text-decoration 等属性与其值中的某些字母是区分大小写的。建议在编写 CSS 代码时还是严格遵守大小写以避免不必要…

白龙地铁消费项目(地铁消费系统,包括用户端、管理端)

大一学的C#可视化项目文件&#xff0c;所有功能均可使用。可以直接下载 下方是演示照片

sigmoid softmax优化

1.前言 最近在搞模型部署发现&#xff0c;推理速度不能满足我们需求&#xff0c;于是最近学习了优化算子技巧&#xff0c;学到了sigmoid&#xff0c;softmax算子优化&#xff0c;真的数学之美。2.sigmoid算子优化 一.算子优化图 我们根据sigmoid公式&#xff0c;我们进行求反…

.NET 8 网络改进

作者&#xff1a; Mňa - Software Engineer, .NET Natalia Kondratyeva - Software Engineer, .NET 排版&#xff1a;Alan Wang 随着新的 .NET 版本的发布&#xff0c;发表有关网络空间中新的有趣变化的博客文章已经成为一种传统。今年&#xff0c;我们要介绍 HTTP 部分的变化…

Python RCL 调试劳德巴赫

Python RCL 调试劳德巴赫 比较旧的调试方式是TRACE32 Remote API, 看起来比较麻烦 新的是RCL trace32的安装路径下有官方的python教程, 用浏览器可以打开 <path>/demo/api/python/rcl/doc/html/index.html 需要先安装python库, 也在trace32安装路径下 <path>/de…

谷歌公布 2023 年最受欢迎的 Chrome 扩展

2023年&#xff0c;谷歌公布了最受欢迎的Chrome扩展&#xff0c;共有12款涵盖了多个领域&#xff0c;从提升工作效率到游戏娱乐。这些扩展旨在增强用户的浏览体验和生产力。 Scribe 功能&#xff1a;使用AI记录工作流程并创建逐步指南。 特点&#xff1a;自动记录和生成详细…

【完整项目】基于Python+Tkinter+FFD(free-form deformations)的2D彩色图像实时网格自由变形软件的设计与实现

文章目录 一、效果展示二、前言介绍三、软件使用说明3.1 环境配置3.2 文件结构3.3 准备工作 四、快速开始五、主要思路算法思路网格变形和实时操作思路 六、总结与反思七、代码链接八、其他完整项目 一、效果展示 校正比萨斜塔&#xff1a; 人脸变形&#xff1a; 图像拼接结果…

【运维】大日志文件按日期划分方法的改进及思考

之前由于运维需求&#xff0c;需要对一个大日志文件按照日期进行划分&#xff0c;将每天的日志写入一个单独的文件中。 刚开始接到这个需求后&#xff0c;我浏览了一遍日志文件&#xff0c;发现里面只有11月17号到11月22号的日志&#xff0c;天数不多&#xff0c;可以尝试手动…

conan 入门(三十七):conan 2.x通过定义环境变量(environment)执行make编译只有Makefile的项目(erpcgen)

之前一篇博客《conan 入门(三十四):conan 2.x实现对只有Makefile的项目(erpcgen)的封装示例》介绍如何用AutotoolsToolchain,Autotools实现来编译只有Makefile的项目&#xff0c;因为Autotools.make,Autotools.install方法就是执行make来编译项目。 我原本是想用self.run来执行…

C# 读取Word表格到DataSet

目录 功能需求 Office 数据源的一些映射关系 范例运行环境 配置Office DCOM 关键代码 组件库引入 ​核心代码 杀掉进程 总结 功能需求 在应用项目里&#xff0c;多数情况下我们会遇到导入 Excel 文件数据到数据库的功能需求&#xff0c;但某些情况下&#xff0c;也存…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十七:演示功能模块相关功能实现

一、本章内容 本章实现常见业务功能,包括文章管理、商品管理、订单管理、会员管理等功能。 1. 详细课程地址: https://edu.csdn.net/course/detail/38183 2. 源码下载地址: 点击下载 二、界面预览 三、开发视频 3.1 B站视频地址: