本文只展示最小生成树Kruskal算法的python实现,我会尽量将代码注释清楚,至于算法原理,自行理解。
class side:
def __init__(self,u,v,w):
self.u=u
self.v=v
self.w=w
n=int(input('请输入点的个数'))
r=[]
for i in range(n):
r.append(i)
def ys(i):
if r[i]==i:
return i
else:
r[i]=ys(r[i])
return r[i]
def pd(u,v):
if ys(u)!=ys(v): r[ys(u)]=ys(v); return 1
else: return 0
s=[]
print('请输入起始点和权重(逗号隔开,q结束):')
while True:
z=input()
if z.upper()=='Q':break
else:
a,b,c=eval(z)
s.append(side(a,b,c))
s=sorted(s,key=lambda t:t.w)
sum=0
for i in range(len(s)):
if(pd(s[i].u,s[i].v)):
sum+=s[i].w
s[i].__dict__['pj']=1
else:
s[i].__dict__['pj']=0
print('最小代价:',sum)
print('最小生成树:')
for i in range(len(s)):
if s[i].pj==1:
print('{}->{}'.format(s[i].u,s[i].v),end=' ')
|