当前位置: 首页 > news >正文

最小生成树——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')

相关文章:

  • Windows 安装 MySQL 最新最简教程
  • 使用Linux docker方式快速安装Plik并结合内网穿透实现公网访问
  • 百卓Smart管理平台 uploadfile.php 文件上传漏洞(CVE-2024-0939)
  • -转换流-
  • 08-Java过滤器模式 ( Filter Pattern )
  • QT设置qss
  • 11 插入排序和希尔排序
  • 《Docker极简教程》--Docker环境的搭建--在Mac上搭建Docker环境
  • C语言使⽤ scanf()函数应注意的问题是什么?
  • 设计模式(结构型模式)桥接模式
  • linux的tree用法
  • 【每日一题】LeetCode——反转链表
  • HCIA-HarmonyOS设备开发认证V2.0-3.轻量系统内核基础
  • vue绘制语音波形图---wavesurfer.js
  • FPS游戏框架漫谈第二十二天
  • 【347天】每日项目总结系列085(2018.01.18)
  • go append函数以及写入
  • Laravel Mix运行时关于es2015报错解决方案
  • XForms - 更强大的Form
  • 阿里云前端周刊 - 第 26 期
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 大数据与云计算学习:数据分析(二)
  • 微信公众号开发小记——5.python微信红包
  • 项目管理碎碎念系列之一:干系人管理
  • 再次简单明了总结flex布局,一看就懂...
  • Java性能优化之JVM GC(垃圾回收机制)
  • Prometheus VS InfluxDB
  • ​secrets --- 生成管理密码的安全随机数​
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • ###C语言程序设计-----C语言学习(6)#
  • #define 用法
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (rabbitmq的高级特性)消息可靠性
  • (ros//EnvironmentVariables)ros环境变量
  • (第27天)Oracle 数据泵转换分区表
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (论文阅读40-45)图像描述1
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • .net refrector
  • .NET/C# 使窗口永不获得焦点
  • .Net多线程总结
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • ??在JSP中,java和JavaScript如何交互?
  • [ IO.File ] FileSystemWatcher
  • [BZOJ 1040] 骑士
  • [C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]
  • [C++]类和对象(中)
  • [CareerCup][Google Interview] 实现一个具有get_min的Queue
  • [DevEpxress]GridControl 显示Gif动画
  • [exgcd] Jzoj P1158 荒岛野人
  • [Foreman]解决Unable to find internal system admin account
  • [HNOI2008]水平可见直线
  • [HNOI2015]实验比较