(Python附代码)Prim算法最小生成树(贪心算法)

(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])

👧帮助到你请点赞➕收藏➕关注哦~

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值