图论---最小生成树问题

        在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。解决最小生成树问题一般有两种算法:Kruskal算法和Prim算法。

Kruskal算法

原理:基本思想是从小到大加入边,是个贪心算法。我们将图中的每个边按照权重大小进行排序,每次从边集中取出权重最小且两个顶点都不在同一个集合的边加入生成树中。注意:如果这两个顶点都在同一集合内,说明已经通过其他边相连,因此如果将这个边添加到生成树中,那么就会形成环。这样反复做,直到选出n-1条边。时间复杂度为O(m*logm)

算法过程:此算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。 具体过程如下所示: 步骤1:先对图中所有的边按照权值进行排序 步骤2:如果当前这条边的两个顶点不在一个集合里面,那么就用并查集的Union函数把他们合并在一个集合里面(也就是把他们放在最小生成树里面),如果在一个并查集里面,我们就舍弃这条边,不需要这条边。 步骤3:一直执行步骤2,知道当边数等于n-1(n为节点个数),那就说明这n个顶点就连合并在一个集合里面了;如果边数不等于顶点数目减去1,那么说明这些边就不连通,即无法构成最小生成树。

代码框架:

int n, m; // n是点数,m是边数 
int p[n + 1]; // 并查集的父节点数组 
struct Edge{ // 存储边  int a, b, w; bool operator< (const Edge &W)const { return w < W.w; } 
}edges[m]; 
​
int find(int x){ // 并查集核心操作 return p[x] == x ? x : p[x] = find(p[x]);
}
void init(){ // 初始化并查集 for(int i = 1; i <= n; i++){p[i] = i;}
}
int kruskal() {sort(edges, edges + m); init();int res = 0, cnt = 0; for (int i = 0; i < m; i++) { // 从m条边选择n-1条边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; res += w; cnt++; } }if (cnt < n - 1) return INF; return res; 
}

Prim算法

原理:基本思想是从一个结点开始,不断加点。因此该算法可以称为“加点法”,每次迭代选择代价最小的边对应的点,加入到最小生成树中。算法从某一个顶点s开始,逐渐长大覆盖整个连通网的所有顶点。时间复杂度为O(n * n + m)。

算法过程:

  1. 用两个集合A{},B{}分别表示找到的点集,和未找到的点集;

  2. 我们以A中的点为起点a,在B中找一个点为终点b,这两个点构成的边(a,b)的权值是其余边中最小的

  3. 重复上述步骤#2,直至B中的点集为空,A中的点集为满

代码框架:

int n; // 节点个数
vector<vector<int>> g(n, vector<int>(n)); // 邻接矩阵,存储所有边
vector<int> dis(n); // 存储其他节点到当前最小生成树的距离
vector<bool> v(n); // 存储每个节点是否加入到最小生成树中
​
// 如果图不连通,则返回INF(值是0x3f3f3f3f), 否则返回最小生成树的树边权重之和
int prim(){const int inf = 0x3f3f3f3f;memset(dis, 0x3f, sizeof dis);int res = 0;for(int i = 0; i < n; i++){int p = -1;for(int j = 0; j < n; j++){if(!v[j] && (p == -1 || dis[j] < dis[p])){p = j;}}if(i && dis[p] == inf){ // dis[p] = inf说明找到的节点与最小生成树不连通,但是当i = 0说明是第一个节点,不考虑连通return inf;}if(i){res += dis[p];}v[p] = true;for(int j = 0; j < n; j++){dis[j] = min(dis[j], g[p][j]); // 与Dijkstra算法的区别}}return res;
}
​

题单

1584. 连接所有点的最小费用 - 力扣(LeetCode)

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

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

相关文章

JS进阶-原型

原型 原型就是一个对象&#xff0c;也称为原型对象 构造函数通过原型分配的函数是所有对象所共享的 JavaScript规定&#xff0c;每一个构造函数都有一个prototype属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象 这个对象可以挂载函数&#xff0c;对象实…

不标准的 json 格式的字符串如何转为标准的(json字符串属性名不带双引号如何转

背景 不规范的 json 字符串例如 属性名不带双引号 {name:"abc"}属性名带单引号而不是双引号 {name:"abc"}属性值该用双引号的时候用了单引号 {"name":abc}还有一种情况就是以上情况的混合 所谓规范的json字串就是属性名要用双引号&#xf…

(二)Apache log4net™ 手册 - 配置

0、引言 在上一篇文章中我们简单介绍了 Log4Net 及其核心的三大组件。本文将在上一篇文章的基础上继续探讨与 Log4Net 配置相关的内容。 1、配置 将日志请求插入到应用程序代码中需要进行大量的计划和工作。观察表明&#xff0c;大约4%的代码专门用于日志记录。因此&#xf…

【Linux】信号屏蔽与信号捕捉的原理与实现(附图解与代码)

这一篇的篇幅可能有点长&#xff0c;如果已经了解了以下两个知识点的同学可以自行跳到第三部分——信号屏蔽的实现。 不太了解的同学希望你们能够静下心来看完&#xff0c;相信一定会有不小的收获。那么话不多说&#xff0c;我们这就开始啦&#xff01;&#xff01;&#xff0…

Linux网络存储:NFS

NSF 笔记&#xff1a; NFS是通过网络来进行服务器和客户端之间的数据传输的&#xff0c;我们大家都知道&#xff0c;要想通过网络进行传输&#xff0c;必须得知道是通过哪一个端口进行传输的&#xff01; NFS服务器对于端口的选择是随机的&#xff0c;那么问题在于&#xff0…

代码随想录算法训练营第四十六天 | 518. 零钱兑换 II、377. 组合总和 Ⅳ

518. 零钱兑换 II 视频讲解&#xff1a;动态规划之完全背包&#xff0c;装满背包有多少种方法&#xff1f;组合与排列有讲究&#xff01;| LeetCode&#xff1a;518.零钱兑换II_哔哩哔哩_bilibili 代码随想录 &#xff08;1&#xff09;代码 377. 组合总和 Ⅳ 视频讲解&…

JOSEF约瑟 闭锁继电器 LB-7 YDB-100 100V 50HZ 控制断路器的合闸或跳闸

闭锁继电器LB-7导轨安装名称:闭锁继电器型号:LB-7闭锁继电器额定电压100V功率消耗≤10VA触点容量220V1.5A40W返回系数≥0.8 LB-1A、LB-1D、DB-1、HBYB-102/D YDB-100、HLO、DB-100、LB-7型闭锁继电器 一、用途 LB-7型闭锁继电器(以下简称继电器)用于发电厂及变电所内高压母线…

MySQL报错:Row size too large (> 8126)

问题描述 1118 - Row size too large ( 8126). Changing some columns to TEXT or BLOB or using ROW_FORMATDYNAMIC or ROW_FORMATCOMPRESSED may help. ln current row format, BLOB prefix of 768 bytes is stored inline. 问题分析 InnoDB引擎建表时&#xff0c;如果最大行…

git stash

git stash 是 Git 中一个非常有用的命令&#xff0c;用于临时保存当前工作目录中的修改&#xff0c;以便你可以切换到其他分支或处理其他任务而不丢失你的修改。它的主要用途是&#xff1a; 保存未提交的修改&#xff1a;你可以使用 git stash 命令将未提交的修改&#xff08;包…

【计算机网络】网络编程接口 Socket API 解读(9)

Socket 是网络协议栈暴露给编程人员的 API&#xff0c;相比复杂的计算机网络协议&#xff0c;API 对关键操作和配置数据进行了抽象&#xff0c;简化了程序编程。 本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍&#xff0c;从而更好的理解 socket 编程。…

Electron笔记

基础环境搭建 官网:https://www.electronjs.org/zh/ 这一套笔记根据这套视频而写的 创建项目 方式一: 官网点击GitHub往下拉找到快速入门就能看到下面这几个命令了 git clone https://github.com/electron/electron-quick-start //克隆项目 cd electron-quick-start //…

提取歌曲伴奏?用对软件一键帮你搞定~

相信大家经常想获取某首歌曲的伴奏&#xff0c;但是不知从何下手&#xff0c;今天这篇教程给大家分享一个超神奇软件&#xff0c;一键提取歌曲伴奏&#xff01; 第一步&#xff1a;打开【音分轨】APP&#xff0c;进入首页点击【人声分离】 第二步&#xff1a;选择导入方式&…

Java小技能:利用反射获取整个项目的枚举字典

文章目录 前言I JAVA反射获取所有枚举类1.1 遍历特定目录1.2 todosee also流水线docker 部署前言 需求:提供一个接口返回项目的所有枚举,提供给前端使用。 I JAVA反射获取所有枚举类 1.1 遍历特定目录 遍历特定目录的枚举,返回给前端使用 @GetMapping("findAnyEnum…

SpringBoot 中使用JPA

最近忙里偷闲&#xff0c;想写一点关于JPA的东西&#xff0c;另外也加深下对JPA的理解&#xff0c;才有了此篇博文。 一、JPA JPA &#xff08;Java Persistence API&#xff09;Java持久化API&#xff0c;是一套Sun公司Java官方制定的ORM 规范&#xff08;sun公司并没有实现…

建议收藏!混迹职场多年总结出的8大技巧!

1. 不要吃“哑巴”亏&#xff1a;不管在什么企业&#xff0c;一定要“会说话”&#xff0c;敢于表达自己&#xff0c;但是又兼顾身边人的感受&#xff0c;考虑好自己的言行将会带来的后果。良好的沟通技巧对于在职场中建立良好的人际关系和解决问题至关重要。学会倾听、表达和理…

C/C++ 排序算法总结

1.冒泡排序 https://blog.csdn.net/weixin_49303682/article/details/119365319 1 #include <stdio.h>2 3 #define N 94 5 void print(int a[])6 {7 for(int i 0; i < N; i)8 {9 printf("%d ", a[i]); 10 } 11 printf("…

为什么mac上有的软件删除不掉?

对于Mac用户来说&#xff0c;软件卸载通常是一个相对简单的过程。然而&#xff0c;有时你可能会发现某些软件似乎“顽固不化”&#xff0c;即使按照常规方式尝试卸载&#xff0c;也依然存在于你的电脑上。这到底是为什么呢&#xff1f;本文将探讨这一问题的可能原因。 1.卸载失…

C#制做一个 winform下的表情选择窗口

能力有限&#xff0c;别人可能都是通过其他方式实现的&#xff0c;我这里简单粗暴一些&#xff0c;直接通过点击按钮后弹出个新窗体来实现。 1、先在form1上增加一个toolstrip控件&#xff0c;再增加个toolstripbutton按钮&#xff0c;用来点击后弹出新窗体&#xff0c;如图&a…

【uniapp】小程序开发5:获取openid、获取手机号

一、获取小程序openid 需要配合后端接口获取授权码&#xff08;code&#xff09; 1&#xff09;调用uni.login()方法获取授权code&#xff0c;并把code传给getOpenid //使用uni.login的时候可以在任何接口下使用即可&#xff0c;主要看打印出来的code值和openid let that t…

智能井盖传感器:城市安全卫士

随着城市人口的不断增加和城市基础设施的不断发展&#xff0c;井盖作为城市道路和排水系统的重要组成部分&#xff0c;承担着确保城市安全和便利性的关键角色。然而&#xff0c;井盖在日常使用中常常面临倾斜、水浸和翻转等问题&#xff0c;这些问题可能导致交通阻塞、行人坠井…