最小生成树PythonPrim算法

该博客介绍了如何运用Prim算法来构造图的最小生成树。首先从用户输入的边中建立边的列表,然后按权重从小到大排序。初始时选择权重最小的边,将其两端点加入点集中。接着不断寻找未加入点集的一端连接已加入点集的边,并更新最小生成树。算法持续进行直至所有点都被包含。最终展示了最小生成树的边信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值