用Python实现最小生成树的Prim算法

 用Prim算法求解无向连通图的最小生成树:

输入的图如下所示:

期望得到的结果:

输入例子如下所示:

6 10

0 1 7

0 2 4

0 3 3

0 5 7

1 3 6

1 4 5

1 5 2

2 3 8

2 4 5

3 4 1

代码如下:

VexNumber,EdgeNumber=list(map(int,input().split()))#读取顶点的个数和边的个数
EdgeList=[[float("inf")]*VexNumber for i in range(VexNumber)]#存放读入的边
for i in range(EdgeNumber):#读取每条边
    Vex1,Vex2,EdgeWeight=list(map(int,input().split()))
    EdgeList[Vex1][Vex2]=EdgeWeight
    EdgeList[Vex2][Vex1] = EdgeWeight
OuputEdge={}#存放最终的结果
RedPoint=[0]#红点集
BluePoint=[i for i in range(1,VexNumber)]#蓝点集
BluePointToRed=[0]*VexNumber#存放每个蓝点对应紫边的另一个红点
PurpleEdgeWeight=[float("inf")]*VexNumber#存放每个蓝点对应的紫边的权重
while len(OuputEdge)<(VexNumber-1):
    #更新紫边权重
    for BluePoint_i in BluePoint:
        for RedPoint_i in RedPoint:
            if EdgeList[BluePoint_i][RedPoint_i]<PurpleEdgeWeight[BluePoint_i]:
                PurpleEdgeWeight[BluePoint_i]=EdgeList[BluePoint_i][RedPoint_i]
                BluePointToRed[BluePoint_i]=RedPoint_i

    #更新红点集和蓝点集
    NewRed=PurpleEdgeWeight.index(min(PurpleEdgeWeight))
    RedPoint.append(NewRed)
    BluePoint.remove(NewRed)
    OuputEdge[(NewRed,BluePointToRed[NewRed])]=PurpleEdgeWeight[NewRed]
    PurpleEdgeWeight[NewRed]=float("inf")
print(OuputEdge)

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

skj1995

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值