最小生成树PythonPrim算法

c0d3c731e5c247009c660b29da2c354c.png

from posixpath import split
from operator import itemgetter
def add():
    weight,v1,v2=input('请输入所含边的权重,端点1,端点2:').split(',')
    weight=int(weight)
    if(weight>0):
        unused.append({'权重':weight,'端点1':v1,'端点2':v2})
        v.add(v1)
        v.add(v2)
    return weight

unused=[]#原始的输入的边的边权、端点
unusedsort=[]#按照权重,从小到大排列的原始数据
v=set()#原始点集
newv=set()#被选中的边的端点
used=[]#被选中的边的边权、端点
tocompare=[]#所有一个端点在原始点集,一个端点在已用点集的边的边权、端点
tocomparesort=[]#按照权重,从小到大排列的所有一个端点在原始点集,一个端点在已用点集的边的边权、端点

print('请按"权重,端点1,端点2"的格式添加已知边,结束请按0,0,0。')
while(1):
    flag=add()
    if flag!=0:
     continue
    else:
        break
for item in unused:
    if item['端点1']==item['端点2']:
        unused.remove(item)
Vmany=len(v)
Emany=len(unused)
unusedsort=sorted(unused,key=itemgetter('权重'))
print('根据Prim算法,初始时任选一个结点,不妨取权重最小(若有边权重最小且相同,则任取其一)的边的一个端点,那么这条边的两个端点都会被去掉。')
newv.add(unusedsort[0]['端点1'])
newv.add(unusedsort[0]['端点2'])
used.append(unusedsort.pop(0))
while(len(newv)!=Vmany):
     #tocompare= [item for item in unusedsort if item['端点1'] in newv and item['端点2'] not in newv elif item['端点2'] in newv and item['端点1'] not in newv]
     for item in unusedsort:
        if item['端点1'] in newv and item['端点2'] not in newv:
             tocompare.append(item)
        elif item['端点2'] in newv and item['端点1'] not in newv:
             tocompare.append(item)
     tocomparesort=sorted(tocompare,key=itemgetter('权重'))
     newv.add(tocomparesort[0]['端点1'])
     newv.add(tocomparesort[0]['端点2'])
     used.append(tocomparesort[0]),
     tocompare=[]
     tocomparesort=[]
print('最小生成树所含的边是:')
for i in used:
    print(i)

运行过程和结果ef59423cf3594fbc8a892b1e76a4df05.png

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值