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

news2025/1/19 14:10:39

          力扣(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.coloradmin.cn/o/1447344.html

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

相关文章

基于 Python 深度学习的电影评论情感分析系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

去空行小工具Html + Javascript

这是一个平常用到的小工具&#xff0c;为了节省屏幕空间把空行去掉&#xff0c;怕要用的时候找不到故记录在此。 效果图 网页版&#xff0c;放在浏览器里就可以用 <!doctype html> <html><head><meta charset"utf-8"><title>去回车…

MySQL数据库⑨_事务(四个属性+回滚提交+隔离级别+MVCC)

目录 1. 事务的概念和四个属性 2. 事务的支持版本 3. 事务的提交方式 4. 事务的相关演示 4.1 常规操作_回滚_提交 4.2 原子性_演示 4.3 持久性_演示 4.4 begin自动更改提交方式 4.5 单条SQL与事务的关系 5. 事务的隔离级别 5.1 四种隔离级别 5.2 查看与设置隔离级别…

Peter算法小课堂—区间模型(2)

上次咋们讲了前两个区间模型&#xff1a;1.最大不重叠区间数 2.不重叠区间最少分组数。今天我们就学习&#xff1a;最小区间覆盖问题、区间重叠最厚层数&#xff01; 最小区间覆盖 先看三道题 那么&#xff0c;第1题&#xff0c;它是浮点数的题&#xff0c;也就要求首尾相同。…

react【五】redux/reduxToolkit/手写connext

文章目录 1、回顾纯函数2、redux2.1 redux的基本使用2.2 通过action修改store的数值2.3 订阅state的变化2.4 目录结构2.5 Redux的使用过程2.6 redux的三大原则2.7 Redux官方图 3、redux在React中的使用4、react-redux使用4.1 react-redux的基本使用4.2 异步请求 redux-thunk4.3…

Pycharm里如何设置多Python文件并行运行

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 夕阳何事近黄昏&#xff0c;不道人间犹有未招魂。 大家好&#xff0c;我是皮皮。 一、前言 相信使用Pycharm的粉丝们肯定有和我一样的想法&#xff0c;…

linux---内存管理

一 虚拟内存 即使是现代操作系统中&#xff0c;内存依然是计算机中很宝贵的资源&#xff0c;看看你电脑几个T固态硬盘&#xff0c;再看看内存大小就知道了。 为了充分利用和管理系统内存资源&#xff0c;Linux采用虚拟内存管理技术&#xff0c;利用虚拟内存技术让每个进程都有…

three.js 细一万倍教程 从入门到精通(三)

目录 五、详解PBR材质纹理 5.1、详解PBR物理渲染 5.2、标准网格材质与光照物理效果 5.3、置换贴图与顶点细分设置 5.4、设置粗糙度与粗糙度贴图 5.5、设置金属度与金属贴图 5.6、法线贴图应用 5.7、如何获取各种类型纹理贴图 5.8、纹理加载进度情况 单张图片加载 多…

C++赛马游戏

题目&#xff1a; 代码&#xff1a; #include<iostream> using namespace std; int a,b,c; int main(){cin>>a>>b>>c;if(a>b&&a>c&&b>c){//a>b>ccout<<c<<" "<<b<<" "&…

docker 3.1 镜像

docker 3.1 镜像命令 拉取镜像 docker pull debian #从 Docker Hub 拉取名为 debian 的镜像docker pull hello-world #从 Docker Hub 拉入名为 hello-world 的镜像‍ 运行镜像/容器 docker run hello-world ‍ 查看本地所有的镜像 docker images​​ 容器生成镜像…

Gitee的使用教程(简单详细)

1.安装git&#xff08;我的电脑自带git&#xff0c;我没弄这步QAQ&#xff09; Git (git-scm.com)https://git-scm.com/ 安装好后在桌面点击鼠标右键会出现git GUI 和 git Bash&#xff08;没有的话点击显示更多选项&#xff09; 2.去gitee上注册一个账号 工作台 - Gitee.co…

LeetCode、208. 实现 Trie (前缀树)【中等,自定义数据结构】

文章目录 前言LeetCode、208. 实现 Trie (前缀树)【中等&#xff0c;自定义数据结构】题目链接与分类思路 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领…

C# WinFrom+AspNetCore WebApi实现大文件下载与上传

客户端UI: 服务端WebApi: 客户端代码&#xff1a; App.config&#xff1a; <?xml version"1.0" encoding"utf-8" ?> <configuration><appSettings><add key"WebApi" value"https://localhost:7285"/><…

Vulnhub靶场 DC-8

目录 一、环境搭建 二、信息收集 1、主机发现 2、指纹识别 三、漏洞复现 1、SQL注入 sqlmap工具 2、dirsearch目录探测 3、反弹shell 4、提权 exim4 5、获取flag 四、总结 一、环境搭建 Vulnhub靶机下载&#xff1a; 官网地址&#xff1a;https://download.vulnhub.com/dc/DC-…

Java基于SpringBoot+vue的租房网站,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

《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…

华为机考入门python3--(12)牛客12-字符串反转

分类&#xff1a;字符串 知识点&#xff1a; 字符串是否为空 if not my_str 字符串逆序 my_str[::-1] 题目来自【牛客】 def reverse_string(s): # 判断字符串是否为空或只包含空格 if not s.strip(): return "" # 使用Python的切片语法反转字符串 re…

【开源】基于JAVA+Vue+SpringBoot的就医保险管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 科室档案模块2.2 医生档案模块2.3 预约挂号模块2.4 我的挂号模块 三、系统展示四、核心代码4.1 用户查询全部医生4.2 新增医生4.3 查询科室4.4 新增号源4.5 预约号源 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVue…

[职场] 大厂群面的基本题型 #学习方法#其他

大厂群面的基本题型 大厂群面的基本题型 群面&#xff0c;又叫做“无领导小组面试”。历年来是企业校招时&#xff0c;进行大批量刷人的有效方法。流行于互联网、快消、银行、四大等多个行业。因为难度大、情况复杂、淘汰率高&#xff0c;又被称为“死亡面试”。 无领导小组…

蓝牙BLE学习-GAP

1.概述 GAP层&#xff08;Generic access profile-通用访问配置文件&#xff09;。GAP是对LL层payload&#xff08;有效数据包&#xff09;如何进行解析的两种方式的一种&#xff0c;而且也是最简单的一种。GAP简单的对LL payload进行一些规范和定义&#xff0c;因此GAP能实现的…