最小生成树——Prim/Kruskal Python

最小生成树

从一个图中,生成一个权重最小的生成树

Prim

朴素版 O ( n 2 ) O(n^2) O(n2) 稠密图

不断重复以下过程:

  • 选择与当前集合距离最近的点,加入集合
  • 拓展当前集合

和Dijsktra的思想类似,每次拓展与当前集合最近的点(而不再是原点)
对应的唯一区别就是

for j in range(1, n+1):dis[j] = min(dis[j], g[t][j])

在Prim里是直接取g[t][j],而dijsktra是取dis[t]+g[t][j]

n,m = map(int, input().split())g = [[float('inf') ] * (n+1) for _ in range(n+1)]dis = [float('inf') ]* (n+1)for i in range(m):x,y,z = map(int, input().split())g[x][y] = min(g[x][y], z)g[y][x] = g[x][y]st = [False] *(n+1)res = 0
for i in range(n):t = -1# 找到距离集合最近的点for j in range(1,n+1):if not st[j] and (t == -1 or dis[j] < dis[t]):t = jif i:res += dis[t]st[t] = Truefor j in range(1, n+1):dis[j] = min(dis[j], g[t][j])if res == float('inf'):print('impossible')
else:print(res)

优化版 O ( m log ⁡ n ) O(m \log{n}) O(mlogn)

和迪杰斯特拉的优化方式一样,使用堆来优化,改成bfs,每次取出队列中距离集合最短的点拓展。

Kruskal 稀疏图

算法流程:

  • 将所有的边按权重从小到大排序
  • 每次取出权重最小的边,如果两个点不属于一个集合,融合他们(并查集)
import heapqn,m = map(int, input().split())
# 首先读入所有的边,存入堆中
edges = []
for i in range(m):x,y,z = map(int, input().split())edges.append((z,x,y))heapq.heapify(edges)
# 设置n个点的并查集
s = [i for i in range(n+1)]def find(x):if s[x] != x:s[x] = find(s[x])return s[x]# 开始出堆,每次取出堆顶元素,融合集合
res = 0
cnt = 0
while edges:t = heapq.heappop(edges)z,x,y = tif find(x) != find(y):s[find(x)] = find(y)res += zcnt += 1if cnt == n-1:print(res)
else:print('impossible')

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

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

相关文章

数字图像处理与Python语言实现-常见图像特效(一)

文章目录 0、准备1、亮度调节2、细节强化3、底片效果4、卡通效果5、浮雕效果6、铅笔素描效果7、夏季或温色滤镜8、冬季或冷色滤波在本文中将演示使用 OpenCV 来模仿流行的 Photoshop 或 Instagram 滤镜的各种图像处理技术。 在文章中,我们将尝试使用各种滤镜,其中许多滤镜会生…

Python并发

Python是运行在解释器中的语言&#xff0c;查找资料知道&#xff0c;python中有一个全局锁&#xff08;GIL&#xff09;&#xff0c;在使用多线程(Thread)的情况下&#xff0c;不能发挥多核的优势。而使用多进程(Multiprocess)&#xff0c;则可以发挥多核的优势真正地提高效率。…

电商小程序04实现登录逻辑

目录 1 创建自定义方法2 获取用户名和密码3 验证用户是否同意协议4 验证用户名和密码总结 上一篇我们实现了登录功能的前端界面&#xff0c;这一篇实现一下登录的具体逻辑。 1 创建自定义方法 一般如果页面点击按钮需要有事件响应的&#xff0c;我们用自定义方法来实现。打开我…

第四篇:数据库安装(命令行)

数据库命令行界面安装 mysql官网&#xff0c;下载解压 https://dev.mysql.com/downloads/mysql/ 在安装之前先去检查一下,本地计算机的用户合组 winr(输入lusrmgr.msc) -点击组-双击administrator 如果只有这两个,那么就添加一下,提高网络服务的权限(避免出现mysql启动失败) …

MySQL之体系结构

华子目录 MySQL简介MySQL的特性MySQL版本MySQL常见版本 数据库排名网站MySQL结构体系查看最大连接数查询缓存配置情况 一条SQL语句执行流程 MySQL简介 MySQL是一个小型关系数据库管理系统&#xff0c;开发者为瑞典MySQL AB公司。在2008年1月16号被sun公司10亿美金收购。2009年…

鸿蒙 WiFi 连接 流程

那当界面上显示扫描到的所有Ap时&#xff0c;我们选择其中的一个Ap发起连接&#xff0c;看下代码流程是怎样的。 // applications/standard/settings/product/phone/src/main/ets/model/wifiImpl/WifiModel.tsconnectWiFi(password: string) {let apInfo this.userSelectedAp…

Cpu指令集

CPU指令集架构是指计算机中央处理器&#xff08;CPU&#xff09;的指令集的设计和组织方式。它定义了CPU能够理解和执行的指令集合&#xff0c;包括指令的格式、操作码&#xff08;Opcode&#xff09;、寻址模式和操作数等。指令集架构决定了CPU的功能和行为&#xff0c;以及如…

springboot项目启动报错:dynamic-datasource can not find primary datasource

项目启动报错信息 Caused by: com.baomidou.dynamic.datasource.exception.CannotFindDataSourceException: dynamic-datasource can not find primary datasourceat com.baomidou.dynamic.datasource.DynamicRoutingDataSource.determinePrimaryDataSource(DynamicRoutingDat…

编程实例分享,手表养护维修软件钟表维修开单管理系统教程

编程实例分享&#xff0c;手表养护维修软件钟表维修开单管理系统教程 一、前言 以下教程以 佳易王钟表维护维修管理系统软件V16.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 左侧为导航栏&#xff0c; 1、系统设置&#xff1a;可以设置打…

【深度学习】pytorch 与 PyG 安装(pip安装)

【深度学习】pytorch 与 PyG 安装&#xff08;pip安装&#xff09; 一、PyTorch安装和配置&#xff08;一&#xff09;、安装 CUDA&#xff08;二&#xff09;、安装torch、torchvision、torchaudio三个组件&#xff08;1&#xff09;下载镜像文件&#xff08;2&#xff09;创建…

Java基础常见面试题总结-集合(二)

迭代器 Iterator 是什么&#xff1f; Iterator模式用同一种逻辑来遍历集合。它可以把访问逻辑从不同类型的集合类中抽象出来&#xff0c;不需要了解集合内部实现便可以遍历集合元素&#xff0c;统一使用 Iterator 提供的接口去遍历。它的特点是更加安全&#xff0c;因为它可以…

【网络技术】【Kali Linux】Nmap嗅探(二)多设备扫描

上期实验博文&#xff1a;&#xff08;一&#xff09;简单扫描 一、实验环境 本次实验进行Nmap多设备扫描&#xff0c;实验使用 Kali Linux 虚拟机&#xff08;扫描端&#xff09;、Ubuntu 22.04虚拟机&#xff08;被扫描端1&#xff09;、Ubuntu 18.04虚拟机&#xff08;被扫…

【力扣】移动零,双指针法

移动零原题地址 方法一&#xff1a;传统双指针法 本题要求把非零元素移动到左边&#xff0c;零移动到右边&#xff0c;这跟快速排序的单趟非常相似。 定义左右指针 left 和 right &#xff0c; right 指针负责探测所有元素&#xff0c;如果遇到非零元素&#xff0c;则左右指…

网课:N皇后问题——牛客(题解和疑问)

题目描述 给出一个nnn\times nnn的国际象棋棋盘&#xff0c;你需要在棋盘中摆放nnn个皇后&#xff0c;使得任意两个皇后之间不能互相攻击。具体来说&#xff0c;不能存在两个皇后位于同一行、同一列&#xff0c;或者同一对角线。请问共有多少种摆放方式满足条件。 输入描述: …

梯度提升树系列5——使用GBDT进行特征选择

特征选择是机器学习和数据科学中至关重要的一环,它不仅可以提高模型的性能,还能显著减少模型训练所需的时间和资源。本文将深入探讨如何使用梯度提升决策树(Gradient Boosting Decision Tree, GBDT)进行特征选择,并强调这一方法在实践中的重要性和效果。 写在开头 特征选…

【力扣】快乐数,哈希集合 + 快慢指针 + 数学

快乐数原题地址 方法一&#xff1a;哈希集合 定义函数 getNext(n) &#xff0c;返回 n 的所有位的平方和。一直执行 ngetNext(n) &#xff0c;最终只有 2 种可能&#xff1a; n 停留在 1 。无限循环且不为 1 。 证明&#xff1a;情况 1 是存在的&#xff0c;如力扣的示例一…

嵌入式学习之Linux入门篇笔记——15,Linux编写第一个自己的命令

配套视频学习链接&#xff1a;http://【【北京迅为】嵌入式学习之Linux入门篇】 https://www.bilibili.com/video/BV1M7411m7wT/?p4&share_sourcecopy_web&vd_sourcea0ef2c4953d33a9260910aaea45eaec8 1.什么是命令&#xff1f; 命令就是可执行程序。 比如 ls -a…

C#静态数组删除数组元素不改变数组长度 vs 动态数组删除数组元素改变数组长度

目录 一、使用的方法 1.对静态数组删除指定长度并不改变数长度的方法 &#xff08;1&#xff09;静态数组 &#xff08;2&#xff09;对静态数组删除元素不得改变其长度 2.对动态数组删除指定长度并改变数长度的方法 &#xff08;1&#xff09;动态数组 &#xff08;2&a…

Golang 并发 Cond条件变量

Golang 并发 Cond条件变量 背景 编写代码过程中&#xff0c; 通常有主协程和多个子协程进行协作的过程&#xff0c;比如通过 WaitGroup 可以实现当所有子协程完成之后&#xff0c; 主协程再继续执行。 如上的场景是主协程等待子协程达到某个状态再继续运行。 但是反过来怎么…

Xilinx FPGA——在线升级

同以前单片机在线升级的做法一样&#xff0c;本质就是通信Flash操作跳转。 一、通信驱动 我使用的是UDP有线传输&#xff0c; 二、Flash芯片驱动 规划Flash芯片的区域&#xff0c;一般bootloader放在起始位置&#xff0c;APP放在bootloader之后的空白区域。 2.1 Flash擦除 我…