(Python附代码)Prim算法最小生成树(贪心算法)
一、问题描述
【问题描述】Prim算法解决的是带权重的无向图上连接所有顶点的耗费最小的生成树。
【输入形式】在屏幕上输入顶点个数和连接顶点间的边的权矩阵。
【输出形式】从源到各个顶点的最短距离及路径。
【样例输入】
8
0 15 7 0 0 0 0 10
15 0 0 0 0 0 0 0
7 0 0 9 12 5 0 0
0 0 9 0 0 0 0 0
0 0 12 0 0 6 0 0
0 0 5 0 6 0 14 8
0 0 0 0 0 14 0 3
10 0 0 0 0 8 3 0
【样例输出】
15: 1<-2
7: 1<-3
9: 1<-3<-4
6: 1<-3<-6<-5
5: 1<-3<-6
3: 1<-3<-6<-8<-7
8: 1<-3<-6<-8
二、算法思路分析
用贪心算法可以设计出构造最小生成树的有效算法。用Prim和Kruscal算法都是应用贪心算法设计策略的典型例子。本文详述Prim算法。
设G=(V, E)是连通带权图,V={1, 2, …, n},arc是其邻接矩阵。构造G的最小生成树思想:首先置S = {1}, 然后只要S是V的真子集就做如下贪心选择:选取满足条件i∈S, j∈V-S,且arc[i][j]最小,则将j加入到S里,整个过程一直进行到S = V为止,选取到的所有边恰好构成G的一棵最小生成树。
三、Prim算法选边过程图解
四、上代码!
MAX = 999
n = int(input())
arc = []
for i in range(n):
arc.append(list(map(int, input().split())))
key = [MAX, MAX, MAX, MAX, MAX, MAX, MAX, MAX]
path = ['1', '', '', '', '', '', '', '']
s = [0]
q = [a for a in range(1, n)]
while len(q) > 0:
v1, v2, temp = 0, 0, MAX
for i in s:
for j in q:
if arc[i][j] != 0:
if arc[i][j] < temp:
v1 = i
v2 = j
temp = arc[i][j]
key[v2] = arc[v1][v2]
path[v2] = str(path[v1]) + '<-' + str(v2 + 1)
s.append(v2)
q.remove(v2)
for i in range(1, n):
print(key[i], end=":")
print(path[i])
👧帮助到你请点赞➕收藏➕关注哦~