普里姆算法概述
- 先看一个应用场景:
(1)修路问题:
(2)正确的思路:
最小生成树
- 最小生成树:
- 图例解析:
普里姆算法
- 介绍:
- 算法核心
- 图解:
(1)分析:
(2)看上图知,它成功避开了长的路径(权值大的)
Python实现普里姆算法
class MinTree(object):
def create_graph(self, graph, vertex: int, data: [], weight: []):
"""
:param graph:图对象
:param vertex:图对应的顶点个数
:param data:图的各个顶点的值
:param weight:图的邻接矩阵
"""
for i in range(vertex):
graph.data[i] = data[i]
for j in range(vertex):
graph.weight[i][j] = weight[i][j]
def show_graph(self, graph):
for link in graph.weight:
print(link)
def prim_algorithm(self, graph, v: int):
"""
:param graph: 图对象
:param v: 表示从图的第几个顶点开始生成,如:"A"->0 ,'B'->1...
:return:
"""
visited = [0] * graph.vertex
visited[v] = 1
h1 = -1
h2 = -1
min_weight = 10000
for k in range(1, graph.vertex):
for i in range(graph.vertex):
for j in range(graph.vertex):
if visited[i] == 1 and visited[j] == 0 and graph.weight[i][j] < min_weight:
min_weight = graph.weight[i][j]
h1 = i
h2 = j
print('边 %s -> %s 权值: %d ' % (graph.data[h1], graph.data[h2], min_weight))
visited[h2] = 1
min_weight = 10000
class MGraph(object):
def __init__(self, vertex):
self.vertex = vertex
self.data = vertex * [0]
self.weight = [[0 for row in range(vertex)] for col in range(vertex)]
if __name__ == '__main__':
vertex_data = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
weights = [[10000, 5, 7, 10000, 10000, 10000, 2],
[5, 10000, 10000, 9, 10000, 10000, 3],
[7, 10000, 10000, 10000, 8, 10000, 10000],
[10000, 9, 10000, 10000, 10000, 4, 10000],
[10000, 10000, 8, 10000, 10000, 5, 4],
[10000, 10000, 10000, 4, 5, 10000, 6],
[2, 3, 10000, 10000, 4, 6, 10000]]
g = MGraph(len(vertex_data))
tree = MinTree()
tree.create_graph(g, len(vertex_data), vertex_data, weights)
tree.show_graph(g)
tree.prim_algorithm(g, 0)
'''输出结果
[10000, 5, 7, 10000, 10000, 10000, 2]
[5, 10000, 10000, 9, 10000, 10000, 3]
[7, 10000, 10000, 10000, 8, 10000, 10000]
[10000, 9, 10000, 10000, 10000, 4, 10000]
[10000, 10000, 8, 10000, 10000, 5, 4]
[10000, 10000, 10000, 4, 5, 10000, 6]
[2, 3, 10000, 10000, 4, 6, 10000]
边 A -> G 权值: 2
边 G -> B 权值: 3
边 G -> E 权值: 4
边 E -> F 权值: 5
边 F -> D 权值: 4
边 A -> C 权值: 7
'''