力扣刷题之旅:高阶篇(四)—— 最小生成树算法

          力扣(LeetCode)是一个在线编程平台,主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目,以及它们的解题代码。   

--点击进入刷题地址 


引言:

        在算法领域中,图论是一个重要且有趣的分支,而最小生成树问题则是图论中的一个经典问题。最小生成树算法用于在一个连通的加权无向图中找到一棵边权值之和最小的生成树。在实际应用中,最小生成树算法常用于网络设计、电路设计等领域

一、最小生成树算法简介

  • 最小生成树算法主要有两种:Prim算法和Kruskal算法
  1. Prim算法
  • 从一个顶点开始,每次选择一条连接已选顶点和未选顶点的最小权边,并将其加入生成树中,直到所有顶点都被选中。
  1. Kruskal算法
  • 将所有边按照权值从小到大排序,然后依次选择边,如果这条边连接的两个顶点不在同一个连通分量中,则将其加入生成树中,直到生成树中包含所有顶点。

二、力扣上的最小生成树题目

题目:“最小生成树”

        给定一个带权无向图,其中每个节点表示一个城市,每条边表示两个城市之间的道路,边上的权重表示道路的长度。请找到该图的最小生成树,即一个包含所有节点的连通子图,使得子图中所有边的权值之和最小

输入格式

  • 第一行包含两个整数n和m,分别表示节点的数量和边的数量。
  • 接下来m行,每行包含三个整数u、v和w,表示节点u和节点v之间有一条权值为w的边。

输出格式

  • 输出一个整数,表示最小生成树的权值之和。

示例输入

4 5  
1 2 3  
1 3 1  
1 4 4  
2 3 2  
2 4 2

示例输出: 

7

解释

        上述输入表示一个包含4个节点和5条边的带权无向图。其中,节点1与节点2之间的边权值为3,节点1与节点3之间的边权值为1,节点1与节点4之间的边权值为4,节点2与节点3之间的边权值为2,节点2与节点4之间的边权值为2。最小生成树为包含边(1, 3)、(2, 3)和(2, 4)的子图,其权值之和为1 + 2 + 2 = 7。

三、解题代码

以下是使用Kruskal算法解决该问题的Python代码示例:
class UnionFind:  def __init__(self, n):  self.parent = list(range(n))  self.rank = [0] * n  def find(self, x):  if self.parent[x] != x:  self.parent[x] = self.find(self.parent[x])  return self.parent[x]  def union(self, x, y):  root_x = self.find(x)  root_y = self.find(y)  if root_x == root_y:  return False  if self.rank[root_x] < self.rank[root_y]:  root_x, root_y = root_y, root_x  self.parent[root_y] = root_x  if self.rank[root_x] == self.rank[root_y]:  self.rank[root_x] += 1  return True  def kruskal(n, edges):  edges.sort(key=lambda x: x[2])  # 按照权值从小到大排序  uf = UnionFind(n)  mst_weight = 0  count = 0  for u, v, w in edges:  if uf.union(u - 1, v - 1):  # 注意节点编号从1开始,而数组索引从0开始  mst_weight += w  count += 1  if count == n - 1:  # 当生成树中包含所有节点时,结束循环  break  return mst_weight  # 读取输入并计算最小生成树权值之和  
n, m = map(int, input().split())  
edges = []  
for _ in range(m):  u, v, w = map(int, input().split())  edges.append((u, v, w))  
print(kruskaln, edges))
示例输入与输出        if name == "main": 
# 示例输入
n, m = 4, 5
edges = [(1, 2, 3), (1, 3, 1), (1, 4, 4), (2, 3, 2), (2, 4, 2)]
# 计算最小生成树权值之和  
mst_weight = kruskal(n, edges)  # 输出结果  
print(mst_weight)  # 输出应为 7


四、总结

         通过解决最小生成树问题,我们学习了两种常见的算法:Prim算法和Kruskal算法这两种算法都能够在加权无向图中找到权值之和最小的生成树。在实际应用中,最小生成树算法常用于构建网络中的最经济、最有效的连接方案,祝大家新年快乐,心想事成!!!

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

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

相关文章

Redis核心技术与实战【学习笔记】 - 28.Redis 6.0新特性(多线程、客户端缓存与安全)

简述 Redis 6.0 新增了几个关键新特性&#xff0c;分别是面向网络处理的多 IO 线程、客户端缓存、细粒度的权限控制&#xff0c;以及 RESP 3 协议的使用。 其中&#xff0c;面向网络处理的多 IO 线程可以提高网络请求处理的速度&#xff0c;而客户端缓存可以让应用直接在客户…

Linux第47步_安装支持linux的第三方库和mkimage工具

安装支持linux的第三方库和mkimage工具&#xff0c;做好移植前的准备工作。 编译linux内核之前&#xff0c;需要先在 ubuntu上安装“lzop库”和“libssl-dev库”&#xff0c;否则内核编译会失败。 mkimage工具会在zImage镜像文件的前面添加0x40个字节的头部信息,就可以得到uI…

Linux笔记之expect和bash脚本监听输出并在匹配到指定字符串时发送中断信号

Linux笔记之expect和bash脚本监听输出并在匹配到指定字符串时发送中断信号 code review! 文章目录 Linux笔记之expect和bash脚本监听输出并在匹配到指定字符串时发送中断信号1.expect2.bash 1.expect 在Expect脚本中&#xff0c;你可以使用expect来监听程序输出&#xff0c;…

Impala-架构与设计

架构与设计 一、背景和起源二、框架概述1.设计特点2.框架优点3.框架限制 三、架构图1.Impala Daemon2.Statestore3.Catalog 四、Impala查询流程1.发起查询2.生成执行计划3.分配任务4.交换中间数据5.汇集结果6.返回结果 总结参考链接 一、背景和起源 现有的大数据查询分析工具H…

树状菜单(利用映射-bootstrap+jQuery实现折叠功能)

效果&#xff08;默认全部展开&#xff09;&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><…

Days 29 ElfBoard LCD屏双电荷泵电路原理

7寸LCD屏幕的屏幕排线中采用的供电电压是5V供电&#xff0c;但是在屏幕工作时需要VCOM-5.3V、AVDD-12.5V、VGL--7V、VGH-17V几组电压&#xff0c;所以要对初始的5V电源进行DC-DC电压变换&#xff0c;在这里我们用到了双电荷泵电路。 再此电路中VCC_5V为电源输入&#xff0c;E…

Codeforces Round 923 (Div. 3) E. Klever Permutation (Java)

比赛链接&#xff1a;Round 923 (Div. 3) EE题传送门&#xff1a;E. Klever Permutation 题目&#xff1a;E. Klever Permutation 样例 #1 样例输入 #1 5 2 2 3 2 10 4 13 4 7 4样例输出 #1 2 1 1 3 2 1 8 4 10 2 7 5 9 3 6 4 10 1 13 5 9 2 12 6 8 3 11 7 1 6 3 7 2 5 4分…

【Docker】Docker Container(容器)

文章目录 一、什么是容器&#xff1f;二、为什么需要容器&#xff1f;三、容器的生命周期容器OOM容器异常退出容器暂停 四、容器命令详解docker createdocker logsdocker attachdocker execdocker startdocker stopdocker restartdocker killdocker topdocker statsdocker cont…

《UE5_C++多人TPS完整教程》学习笔记5 ——《P6 在线子系统(Online Subsystem)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P6 在线子系统&#xff08;Online Subsystem&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者&a…

LeetCode周赛384 题解

AK 第 384 场周赛 - 力扣&#xff08;LeetCode&#xff09; 前两题都是签到, 略。 第三题: 回文字符串的最大数量 1、题意: 给定一个字符串数组&#xff0c;总字符数量不超过1e6, 可以交换其中的任意两个字符&#xff0c;问能构造最多几个回文字符串。 2、题解: 首先我…

Java图形化界面编程—— ImageIO 笔记

2.8.4 ImageIO的使用 在实际生活中&#xff0c;很多软件都支持打开本地磁盘已经存在的图片&#xff0c;然后进行编辑&#xff0c;编辑完毕后&#xff0c;再重新保存到本地磁盘。如果使用AWT要完成这样的功能&#xff0c;那么需要使用到ImageIO这个类&#xff0c;可以操作本地磁…

二、ClickHouse简介

ClickHouse简介 前言一、行式存储二、DBMS功能三、多样化引擎四、高吞吐写入能力五、数据分区与线程级并行六、场景七、特定版本 前言 ClickHouse 是俄罗斯的 Yandex 于 2016 年开源的列式存储数据库&#xff08;DBMS&#xff09;&#xff0c;使用 C 语言编写&#xff0c;主要…