如果不了解算法思想,请移步 http://c.biancheng.net/algorithm/prim.html

建立图

class Graph:def __init__(self,vertex_num,edges):# 权重初始化为无穷self.vertex_num = vertex_numself.edges = np.zeros(shape=(vertex_num,vertex_num),dtype=int)self.edges = self.edges+np.inf# 对角线初始化为0for i in range(vertex_num):self.edges[i][i] = 0# 初始化边for i,j,weight in edges:self.edges[i][j] = weightdef prim(self,start):pass
vertex_num = 6
edges = [(0,1,6),(0,2,3),(0,4,7),(1,0,6),(1,2,4),(1,3,2),(1,5,5),(2,0,3),(2,1,4),(2,3,3),(2,4,8),(3,1,2),(3,2,3),(3,5,2),(4,0,7),(4,2,8),(5,1,5),(5,3,2)
]
graph = Graph(vertex_num,edges)

关键数据结构

需要一个静态链表parent来表示生成树(树的双亲表示法)

需要一个dist数组表示当前生成树距离各个顶点的距离

parent = {}
dist = {}

初始化

然后有一个非常关键的步骤是dist和parent的初始化。

此时dist中已经有一个起点start

初始化dist为start到其它顶点的距离

start的邻接点的parent需要初始化为start

# 初始化距离
for i in range(self.vertex_num):dist[i] = self.edges[start][i]parent[i] = start
parent[start] = -1

循环过程

找到离树最近的顶点

# 取出离树最近的顶点
min_dist = np.inf
min_vertex = 0
for i in range(self.vertex_num):if dist[i] and dist[i]<min_dist:min_dist = dist[i]min_vertex = i

然后将该顶点添加到树中,即将dist[min_vertex]置零即可

# 将min_vertex添加到树中
dist[min_vertex] = 0
# 更新该顶点的邻接节点到树的距离
for i in range(self.vertex_num):if dist[i] and self.edges[min_vertex][i]<dist[i]:dist[i] = self.edges[min_vertex][i]parent[i] = min_vertex

循环上面两个过程,直到所有的节点都添加到树中

# 当找不到最近的节点时,也就是说所有的节点都在树中,即可退出
if min_dist==np.inf:break

完整代码

class Graph:def __init__(self,vertex_num,edges):# 权重初始化为无穷self.vertex_num = vertex_numself.edges = np.zeros(shape=(vertex_num,vertex_num),dtype=int)self.edges = self.edges+np.inf# 对角线初始化为0for i in range(vertex_num):self.edges[i][i] = 0# 初始化边for i,j,weight in edges:self.edges[i][j] = weightdef prim(self,start):# 表示树parent = {}# 表示当前树到各个顶点的距离,已经在树内的顶点距离为0# 与树邻接的顶点距离为weight,不相邻的顶点距离为无穷大dist = {}# 初始化距离for i in range(self.vertex_num):dist[i] = self.edges[start][i]parent[i] = startparent[start] = -1while True:# 取出离树最近的顶点min_dist = np.infmin_vertex = 0for i in range(self.vertex_num):if dist[i] and dist[i]<min_dist:min_dist = dist[i]min_vertex = i# 当找不到最近的节点时,也就是说所有的节点都在树中,即可退出if min_dist==np.inf:break# 将min_vertex添加到树中dist[min_vertex] = 0# 更新该顶点的邻接节点到树的距离for i in range(self.vertex_num):if dist[i] and self.edges[min_vertex][i]<dist[i]:dist[i] = self.edges[min_vertex][i]parent[i] = min_vertexreturn parentvertex_num = 6
edges = [(0,1,6),(0,2,3),(0,4,7),(1,0,6),(1,2,4),(1,3,2),(1,5,5),(2,0,3),(2,1,4),(2,3,3),(2,4,8),(3,1,2),(3,2,3),(3,5,2),(4,0,7),(4,2,8),(5,1,5),(5,3,2)
]
graph = Graph(vertex_num,edges)
graph.prim(0)

新人写博客,有用点个赞哦,这对我是莫大的鼓励

最小生成树-Prim算法的Python实现相关推荐

  1. [Java学习] 最小生成树——Prim算法

    文章目录 最小生成树 Prim算法流程 应用实例 求最小生成树 最小生成树 百度百科上对于最小生成树的定义是这样的:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结 ...

  2. 最小生成树Prim算法Java版

    最小生成树Prim算法Java版 算法描述: 在一个加权连通图中,顶点集合V,边集合为E 任意选出一个点作为初始顶点,标记为visit,计算所有与之相连接的点的距离,选择距离最短的,标记visit. ...

  3. D-OJ刷题日记:使用邻接矩阵实现最小生成树Prim算法 题目编号:1135

    理解: [理解prim算法本质--让一棵小树逐渐长大] Prim算法:又称为加边法,即每次选择最小权值的边加入到生成树中,然后再更新权值,如此反复,保证每次最优来达到最优解. Prim算法生成树用的是 ...

  4. 西南科技大学OJ题 求最小生成树(Prim算法)1075

    求最小生成树(Prim算法) 1000(ms) 10000(kb) 2256 / 4495 Tags: 生成树 求出给定无向带权图的最小生成树.图的定点为字符型,权值为不超过100的整形.在提示中已经 ...

  5. 最小生成树-Prim算法详解(含全部代码)

    目录 适用条件 测试所用图 算法详解 Prim算法代码 全部代码 实验结果 适用条件 加权连通图 测试所用图 所用原图及生成过程 其中,(a) 为原图,圆圈里面是节点的名称,边上的数字是边的权值.由实 ...

  6. 最小生成树 - Prim算法

    最小生成树 - Prim算法 思路: 采用 贪心策略,每次选取连通块外延的最短边和对应的点放入连通块,再更新新的连通块外延的边.连通部分逐渐扩大,最后将整个图连通起来,并且边长之和最小. 时间复杂度: ...

  7. 【数据结构】最小生成树(Prim算法,普里姆算法,普利姆)、最短路径(Dijkstra算法,迪杰斯特拉算法,单源最短路径)

    文章目录 前置问题 问题解答 一.基础概念:最小生成树的定义和性质 (1)最小生成树(Minimal Spanning Tree)的定义 (2)最小生成树(MST)的性质 二.如何利用MST性质寻找最 ...

  8. 【数据结构】最小生成树 Prim算法 Kruskal算法

    最小生成树应用场景: 假设以下场景,有一块木板,板上钉上一些钉子,这些钉子可以由一些细绳连接起来.假设每个钉子可以通过一根或者多根细绳连接起来,那么一定存在这样得情况,即用最少的细绳把所有的钉子连接起 ...

  9. 生成树的概念,最小生成树Prim算法 Kruskal算法

    求解最小生成树可以用Prim算法 Kruskal算法

  10. POJ2728 Desert King ——01分数规划Dinkelbach迭代法+最小生成树prim算法

    首先,纪念我用Linux系统AC的第一题-   安装这个万恶的NOI Linux系统费了6小时的时间,不过好在最后终于装上了,但是因为我安装的Linux系统比较烂,还遭到了小花儿和js的鄙视,唉,本人 ...

最新文章

  1. R语言ggplot2可视化:修改已经创建的ggplot2可视化对象进行自定义的修改、使用ggplot_build函数更改已经创建的可视化结果
  2. 用onerror处理图片获取失败问题
  3. 一大波 Android 刘海屏来袭,全网最全适配技巧!
  4. GitHub 上有哪些好用的爬虫?
  5. 用户 'IIS APPPOOL\***' 登录失败(转载)
  6. docker学习之-什么是docker
  7. 代理模式、动态代理及其应用
  8. Webpack使用教程五(Babel)
  9. 免费直播编码软件应用技巧
  10. Java调用ffmepg+mencoder视频格式转换(*)
  11. J2Cache+Spring注入配置参数,无需读取固定路径下的j2cache.properties配置文件
  12. 游戏俄罗斯方块(c语言)
  13. 用CSS3实现无限循环的无缝滚动
  14. 【总结】程序员运营公众号一年总结
  15. 国庆怎么玩?国庆去面试!
  16. mysql 唯一键_MySQL数据库8(十)唯一键
  17. Dell戴尔笔记本电脑G5 15 5590原装出厂Windows10系统1903恢复原厂oem系统
  18. TexturePacker(图片打包工具)使用教程---初级篇
  19. IDC机房维护的成本,和托管的成本对比
  20. 【ICPC 2021 沈阳站】心路历程·总结分析

热门文章

  1. readonly(C# 参考)
  2. 【排序算法】堆排序——常规方法
  3. UPC 2019年第二阶段我要变强个人训练赛第六场
  4. mysql基础-数据库连接、创建、删除、选择等基本操作详解(一)
  5. Android—— Fragment 真正的完全解析(上)(转)
  6. 查看一个数是不是2的n次方
  7. ASP.net2.0页面运行时“无法显示XML页”的解决办法
  8. Linux操作系统中使用“autogen.sh+configure+make”编译代码的方法
  9. Linux操作系统中ps命令常见用法
  10. 40.django中重要概念