最小生成树-Prim与Kruskal算法

文章目录

  • 什么是最小生成树?
  • Prim算法求最小生成树
    • Python实现:
  • Kruskal算法求最小生成树
      • 并查集
    • Python实现:
  • Reference

什么是最小生成树?

在图论中,树是图的一种,无法构成闭合回路的节点-边连接组合称之为树;
加权无向图中,连通一棵总权值最小的树称为最小生成树。

对于最小生成树的经典解法主要是Prim和Kruskal算法:

Prim算法求最小生成树

  1. 从任意节点开始,初始化生成树为空;
  2. 每次选择一条从已加入生成树的节点到未加入节点之间的最小边
  3. 将新的节点加入生成树,并更新所有未加入节点与生成树之间的最小边
  4. 重复步骤2-3,直到所有节点都加入生成树。

Python实现:

class Node:def __init__(self,node,length):self.node = nodeself.length = lengthclass Edge:def __init__(self, x, y, length):self.x = xself.y = yself.length = lengthclass Prim:def __init__(self,n,m):self.n = nself.m = mself.v = [[] for i in range(n+1)]       # 邻接表self.e = []   # 存放与当前节点相连的边self.s = []   # 存放最小生成树里的所有边self.vis = [False for i in range(n+1)]  # 用于存放每个节点是否已加入生成树的标记def graphy(self):# 用邻接表构建图for i in range(self.m):x, y, length = list(map(int, input().split()))self.v[x].append(Node(y,length))self.v[y].append(Node(x,length))def insert(self, point):# 找到一个新节点for i in range(len(self.v[point])):# 将最小边的新节点加入生成树if not self.vis[self.v[point][i].node]:self.e.append(Edge(point,self.v[point][i].node,self.v[point][i].length))self.vis[point] = Trueself.e = sorted(self.e, key = lambda e:e.length)def run(self, start):# 求解录入的无向连通图的最小生成树self.insert(start)for _ in range(self.n-1):for i in range(len(self.e)):if not self.vis[self.e[i].y]:self.s.append(self.e[i])self.insert(self.e[i].y)break# 判断是否存在连通if len(self.s) != (self.n - 1):print("error!")else:count = 0for i in range(len(self.s)):count += self.s[i].lengthprint(count)def main():n, m = list(map(int, input().split()))prim = Prim(n, m)prim.graphy()prim.run(1)if __name__ == '__main__':main()

Kruskal算法求最小生成树

  1. 对所有边按权重进行排序;
  2. 初始化一个空的生成树,以及一个并查集(Union-Find)来跟踪节点的连接情况;
  3. 逐条检查排序后的边,尝试将边加入生成树:
    a. 如果当前边连接的两个节点不在同一个集合,则加入该边,并合并这两个节点所在的集合;
    b. 如果当前边连接的两个节点已经在同一个集合,则跳过此边,避免形成环;
  4. 重复步骤3,直到生成树中有 (N-1,N是节点数) 条边。

并查集

并查集(Union-Find
Set)是一种高效的数据结构,主要用于解决一些动态连通性问题。它可以快速地判断某两个元素是否属于同一个集合,同时支持合并两个集合的操作。

并查集最常见的应用场景是:判断加权无向图中的连通性问题,例如:

判断两个节点是否属于同一个连通分量。 动态合并两个连通分量。

在这里插入图片描述

Python实现:

class Edge:def __init__(self, x, y, length):self.x = xself.y = yself.length = lengthclass Kruskal:def __init__(self, n, m):self.n = nself.m = mself.e = []   # 保存所有边self.s = []   # 存放最小生成树里的所有边self.parent = list(range(n+1))for i in range(m):x,y,length = list(map(int,input().split()))self.e.append(Edge(x,y,length))self.e.sort(key = lambda e:e.length)def find(self,f):if f == self.parent[f]:return felse:self.parent[f] = self.find(self.parent[f])return self.parent[f]def merge(self,fa,fb):a = self.find(fa)b = self.find(fb)self.parent[a] = bdef run(self):for j in range(self.m):ed = self.e[j]if self.find(ed.x) != self.find(ed.y):self.s.append(ed)self.merge(ed.x, ed.y)if len(self.s) != self.n - 1:print("error!")else:count = 0for i in range(len(self.s)):count += self.s[i].lengthprint(count)def main():n,m = list(map(int,input().split()))kruskal = Kruskal(n,m)kruskal.run()if __name__ == "__main__":main()

Reference

最小生成树:Prim算法和Kruskal算法
蓝桥云课-最小生成树
并查集

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

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

相关文章

关闭AWS账号后,服务是否仍会继续运行?

在使用亚马逊网络服务(AWS)时,用户有时可能会考虑关闭自己的AWS账户。这可能是因为项目结束、费用过高,或是转向使用其他云服务平台。然而,许多人对关闭账户后的服务状态感到困惑,我们九河云和大家一起探讨…

Could not locate device support files.

报错信息:Failure Reason: The device may be running a version of iOS (13.6.1 17G80) that is not supported by this version of Xcode.[missing string: 869a8e318f07f3e2f42e11d435502286094f76de] 问题:xcode15升级到xcode16之后,13.…

Linux文件基础

目录 一、文件类型 二、文件权限 三、权限修改 Linux中一切皆文件,文件目录分布呈树状数据结构,/是根目录,目录的源头 一、文件类型 类型字符说明普通-Linux中最多的一种文件类型,包括 纯文本文件(ASCII)、二进制文件(binary…

自然语言处理基础之文本预处理

一. NLP介绍 1957年, 怛特摩斯会议 二. 文本预处理 文本预处理及作用 将文本转换成模型可以识别的数据 文本转化成张量(可以利用GPU计算), 规范张量的尺寸. 科学的文本预处理可以有效的指导模型超参数的选择, 提升模型的评估指标 文本处理形式 分词 词性标注 命名实体识别…

外卖点餐系统小程序

目录 开发前准备 项目展示项目分析项目初始化封装网络请求 任务1 商家首页 任务分析焦点图切换中间区域单击跳转到菜单列表底部商品展示 任务2 菜单列表 任务分析折扣信息区设计菜单列表布局请求数据实现菜单栏联动单品列表功能 任务3 购物车 任务分析设计底部购物车区域添加商…

彻底理解如何保证ElasticSearch和数据库数据一致性问题

一.业务场景举例 需求: 一个卖房业务,双十一前一天,维护楼盘的运营人员突然接到合作开发商的通知,需要上线一批热门的楼盘列表,上传完成后,C端小程序支持按楼盘的名称、户型、面积等产品属性全模糊搜索热门…

单片机将图片数组调出来显示MPU8_8bpp_Memory_Write

界面显示图片是很常见的需求,使用外挂的FLASH是最常用的方法。但是如果图片需求不大,比如说我们只要显示一个小图标,那么为了节省硬件成本,是不需要外挂一颗FLASH芯片的,我们可以将图标转成数组,存在单片机…

VS的安装和配置

目录 概述 安装Visual Studio 下载引导安装包 在线安装(推荐) 使用Visual Studio进行开发 创建项目 配置项目 项目 VS 解决方案(重要) 命名 完成项目创建 创建源文件 编写代码 VS项目目录的说明(补充&…

linux模拟HID USB设备及wireshark USB抓包配置

文章目录 1. 内核配置2. 设备配置附 wireshark USB抓包配置 linux下模拟USB HID设备的简单记录&#xff0c;其他USB设备类似。 1. 内核配置 内核启用USB Gadget&#xff0c;使用fs配置usb device信息。 Device Drivers ---> [*] USB support ---><*> USB …

【C++】vector的使用

1. vector的构造 (constrator)构造函数声明 接口说明 vector(); (重点) 无参构造 vector (const vector& x); &#xff08;重点&#xff09; 拷贝构造 vector (InputIterator first, InputIterator last); 使用迭代器区间进行初始化构造 vector (size_type n, co…

Easy Excel 通过【自定义批注拦截器】实现导出的【批注】功能

目录 Easy Excel 通过 【自定义批注拦截器】实现导出的【批注】功能需求原型&#xff1a;相关数据&#xff1a;要导出的对象字段postman 格式导出对象VO 自定义批注拦截器业务代码&#xff1a; 拦截器代码解释&#xff1a;详细解释&#xff1a;格式优化&#xff1a; Easy Excel…

Qt/C++基于重力模拟的像素点水平堆叠效果

本文将深入解析一个基于 Qt/C 的像素点模拟程序。程序通过 重力作用&#xff0c;将随机分布的像素点下落并水平堆叠&#xff0c;同时支持窗口动态拉伸后重新计算像素点分布。 程序功能概述 随机生成像素点&#xff1a;程序在初始化时随机生成一定数量的像素点&#xff0c;每个…

矩阵重构——sortrows函数

s o r t r o w s sortrows sortrows函数依据某列的属性对其元素所在的行进行排序从而进行矩阵的排序 s o r t r o w s sortrows sortrows函数常用方法&#xff1a; 1. 1. 1. s o r t r o w s ( a , [ c 1 , c 2 ] ) sortrows(a,[c_1,c_2]) sortrows(a,[c1​,c2​])&#xff0c…

Linux之网络基础

网络发展 网络的发展可以从人与人之间的工作模式开始谈起, 人与人的工作模式反应了机器与机器的工作模式: 1. 独立模式: 在网络发展的早期计算机间处于独立模式, 计算机之间相互独立 最开始计算机之间是独立运行的, 数据之间的交互需要人用软盘等存储介质拷贝过去, 一般涉及…

【pyspark学习从入门到精通22】机器学习库_5

训练-验证分割 TrainValidationSplit 模型为了选择最佳模型&#xff0c;会对输入数据集&#xff08;训练数据集&#xff09;进行随机分割&#xff0c;分成两个子集&#xff1a;较小的训练子集和验证子集。分割只执行一次。 在这个例子中&#xff0c;我们还将使用 ChiSqSelect…

【Petri网导论学习笔记】Petri网导论入门学习(十一) —— 3.3 变迁发生序列与Petri网语言

目录 3.3 变迁发生序列与Petri网语言定义 3.4定义 3.5定义 3.6定理 3.5例 3.9定义 3.7例 3.10定理 3.6定理 3.7 有界Petri网泵引理推论 3.5定义 3.9定理 3.8定义 3.10定义 3.11定义 3.12定理 3.93.3 变迁发生序列与Petri网语言 对于 Petri 网进行分析的另一种方法是考察网系统…

IDEA:配置Serializable class without ‘serialVersionUID’ 找不到

在使用Java原生序列化的时候&#xff0c;serialVersionUID起到了一个类似版本号的作用&#xff0c;在反序列化的时候判断serialVersionUID如果不相同&#xff0c;会抛出InvalidClassException。 File -> Settings -> Editor -> Inspections -> 搜索 Serialization …

win10 禁止更新

一、winR 输入 regedit 二、输入注册列表路径&#xff1a; &#xff08;1&#xff09;计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings &#xff08;2&#xff09;按照格式&#xff0c;创建文件命名: FlightSettingsMaxPauseDays &#xff08;3&…

OpenAI Whisper 语音识别 模型部署及接口封装

环境配置: 一、安装依赖&#xff1a; pip install -U openai-whisper 或者&#xff0c;以下命令会从这个存储库拉取并安装最新的提交&#xff0c;以及其Python依赖项&#xff1a; pip install githttps://github.com/openai/whisper.git 二、安装ffmpeg&#xff1a; cd …

springboot视频网站系统的设计与实现(代码+数据库+LW)

摘 要 使用旧方法对视频信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在视频信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的视频网站系统管理员功…