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)
运行过程和结果