第十一章 图论 Part7

目录
  • 最小生成树算法
    • prim算法
      • 适用范围:无向图
      • 思路
    • kruskal算法
      • 适用范围: 无向图
      • 思路

最小生成树算法

prim算法

适用范围:无向图

思路

以将所有点归入最小生成树为目标,每次并入一个,最终生成最小生成树。
每次并入的步骤:

  1. 确定选哪个节点并入 (不在最小生成树里的,距离最小生成树(已并入的点)最小的节点) 遍历每个点,得到最小距离的那个点及最小距离。 (顶点编号)
  2. 将第一步选到的点加入到最小生成树中,用一个bool列表记录已经加入的点。
  3. 更新非生成树节点到生成树的距离。 (与cur相连的某节点的权值,比该节点距离最小生成树小 =》 因为cur加入最小生成树后,其他节点需要更新距离这个最新形成的部分最小生成树距离) =》 观察4这个节点随着各个节点的加入,距离最小生成树的最小值的变化;以及最终作为被选取的点加入到最小生成树的过程。

如果想记录这个最小生成树的边,则使用parent数组(元素值表示使当前节点更新的前一个节点),在第三步更新时记录即可,如果后续节点的加入还会使该点更新,则parent数组实际也会更新。



v,e = map(int,input().split()) # 顶点数,边数
graph = [[float('inf')]* (v+1) for _ in range(v+1)] #邻接矩阵for _ in range(e):x,y,k = map(int,input().split())#无向图关于对角线对称,x到y的距离与y到x的距离相等graph[x][y] = kgraph[y][x] = kinTreePoints = [False]* (v+1) #是否加入到最小生成树中
minValVec = [float('inf')]* (v+1) #所有点的最小距离列表,初始化每个距离为10001for i in range(1,v):  # 选完v-1个点,最后一个也确认了,它们一起构成最小生成树#1. 确认新加入的点的编号(谁距离最小生成树最近就加谁)cur = 1minDist = float('inf') #最大的权值 for j in range(1,v+1): #遍历所有还未加入最小生成树的点,确认要新加入的点的编号if not inTreePoints[j] and minValVec[j] < minDist:minDist = minValVec[j] #更新最小距离,以便在后续迭代中继续比较cur = j #更新新加入的点的编号,当循环退出时,确定新加入的点的编号#2.记录新加入的点inTreePoints[cur] = True#3.因为最小生成树有了新加入的点,更新每个未确定的点到部分最小生成树的最小距离for j in range(1,v+1):if (j not in inTreePoints and graph[cur][j] < minValVec[j]):#某点到最小生成树的距离可能由于最小生成树新加入了点而改变minValVec[j] = graph[cur][j]res = 0
for i in range(2,v+1):res+=minValVec[i]print(res)

kruskal算法

适用范围: 无向图

思路

以边为中心考虑,不断去添加最小的边合成一个集合(注意要添加不在一个集合的边,否则就是冗余边,会形成环),刚开始组成的图有可能是不连通的,但随着边的添加,最后一定会形成连通图,并且是最小连通子图即最小生成树,这种将点放入同一集合,判断点是否在同一集合中的逻辑,使用并查集来实现。下面简单给出算法(未给输入)。如果需要记录最小生成树的边,对于kruskal算法非常简单,join时添加当前边即可。

class UnionFind:def __init__(self,n):self.father = [0] * (n+1)for i in range(1,n+1):self.father[i] = i# (查) def find(self,u): if u == self.father[u]:return uelse:self.father[u] = self.find(self.father[u])  # 路径压缩(一直像上层返回最底层的值,并且一直赋值)return self.father[u]# 判断 u 和 v 是否找到同一个根def is_same(self,u, v): u = self.find(u)v = self.find(v)return u == v# 将 v->u 这条边加入并查集 (并)def join(self,u, v):u = self.find(u)  # 寻找 u 的根v = self.find(v)  # 寻找 v 的根if u == v:return  # 如果发现根相同,说明在一个集合,不用两个节点相连,直接返回self.father[v] = u #否则其中一根归于另一根#kruskal算法
#1.按照边的权值由小到大排序
edges.sort(key=lambda x: x[2])
unionFind = UnionFind(v+1)res = 0
for edge in edges:if not unionFind.is_same(edge[0],edge[1]):res += edge[2]join(edge[0],edge[1])   

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

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

相关文章

小甲鱼FishC课后作业

第009讲:了不起的分支和循环30.下面的循环会打印多少次”i love fishc“ for i in range(0,10,2):print("i love fishc") 答:范围0-10,步进为2,打印5次1.下面的循环会打印多少次"I Love FishC"? for i in 5:print(I Love FishC) 答:报错int object i…

图与网络——最短路问题精解

最短路问题(Shortest Path Problem)是图论中的一个经典问题,广泛应用于现实世界中的多个领域。该问题的核心在于如何在一个图中找到给定起点和终点之间路径权重最小的路径。路径权重通常代表时间、成本、距离等因素,因此最短路问题不仅具有理论上的研究价值,还在实际问题的…

原始数据都一样,为啥Pyecharts做出来的图一个是彩色的,另一个是黑白的?

大家好,我是Python进阶者。 前言 前几天在铂金交流群里,有个叫【小朋友】的粉丝在Python交流群里问了一道关于Pyecharts可视化的问题,初步一看觉得很简单,实际上确实是有难度的,问题如下。乍一看,这个问题不知道他在说什么,看完代码之后,我才明白他的意思。 一、思路 下…

JDK mac版本安装及环境变量配置

官网下载jdk 8 注意:M芯片必须ARM版本否则编译报错安装失败!安装jdk (双击 -- 继续) 配置环境变量3.1 打开终端窗口,执行以下命令:3.2 执行命令打开.zshrc文件修改环境变量配置3.3 执行以下命令修改配置:export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-1.8.jd…

NATAPP实现内网穿透简易教程

NATAPP是什么 NATAPP是一个十分容易上手的内网穿透工具,可以把本机的ip和端口映射到公网,将本机暴露在公网中供他人访问。 这在进行一些回调接口的本地测试(如支付宝微信支付的回调接口)时十分好用,同时也可以用来搭建服务器私服,和朋友一起畅快联机。 NETAPP提供了两条免…

ThreadLocal线程重用时带来的问题

背景 我们都知道ThreadLocal实现了资源在线程内独享,线程之间隔离。 实际使用中,ThreadLocal适用于变量在线程间隔离,而在方法或类间共享的场景。比如用户信息,当用户信息需要在多个方法之间传递或者共享使用的时候,同时,每个Tomcat请求的用户信息是私有的。这时可使用Th…

Windows Server 2022 rdp

继续水一篇: 2022废弃了xddm转而使用wddm, rdp的渲染有比较大的变化。 高版本的unreal又需要2022支持,被迫走上魔改windows以提升2022 rdp环境下抓屏帧数的道路。 测试代码来自 https://github.com/robmikh/Win32CaptureSample ,只手动添加了输出fps逻辑。 patch windows后…

DuckDB简单使用及Python操作

DuckDB简介 DockUB官网DuckDB是一款开源免费类似Sqlite的嵌入式数据库,支持直接使用内存或单个文件作为数据库。 DuckDB着重于数据处理和分析,是一个款OLAP(联机分析处理)类型的数据库,主要特点如下:开源免费,MIT协议 功能完善,支持标准SQL、事务、二级索引等 高性能,…

CloudFire+PicGo搭建免费图床

目录CloudFire对象存储创建bucket配置域名配置 Bucket 访问 APIPicGO配置 CloudFire对象存储 | CloudFire提供对象存储服务,每个月有10G的免费额度,并且直连稳定可靠,无需CDN加速,足够作为日常图床使用。 创建bucket 打开CloudFire官网并注册账号,点击R2存储。创建图床buc…

Invicti v24.9.0 发布下载,新增功能概览

Invicti v24.9.0 发布下载,新增功能概览Invicti v24.9.0 for Windows - Web 应用程序安全测试 Invicti Standard v24.9.0 – 10 Sep 2024 请访问原文链接:https://sysin.org/blog/invicti/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.orgInvicti 是一种自动化…

Parallels Desktop 20 发布下载,macOS Sequoia 和 Windows 11 24H2 支持准备就绪

Parallels Desktop 20 发布下载,macOS Sequoia 和 Windows 11 24H2 支持准备就绪Parallels Desktop for Mac 20.0.0 (build 55653) - 在 Mac 上运行 Windows macOS Sequoia 和 Windows 11 24H2 支持准备就绪 请访问原文链接:https://sysin.org/blog/parallels-desktop/,查看…

rsync 学习笔记(一)编译

一、背景rsync二进制程序依赖外部库,由于安全问题,有时会单独升级依赖的外部库。另外为了防止因为栈溢出攻击导致服务器被黑,需要对rsync及其依赖的外部库重新编译,开启安全编译选项,增加黑客破解的复杂度。所有的库编译必须要求加上如下编译选项:栈保护(-fstack-protect…