# -*- coding: utf8 -*-
from sys import maxint
from heapq import *
class edge:
adjvex=''
lowcost=maxint
class miniSpanTree:
@staticmethod
def prime(node,connected,begin):
#适用于边稠密的网
beginIndex = node.index(begin)
#辅助数组设计得真是精妙
closedge=[edge() for i in range(len(node))]
for i in range(len(node)):
if i!=beginIndex:
closedge[i].adjvex=begin
closedge[i].lowcost=connected[beginIndex][i]
closedge[beginIndex].lowcost=0
for i in range(len(node)-1):
minVal=maxint
index=-1 #下一个加入U集合的节点
for each in range(len(closedge)):
if closedge[each].lowcost != 0 and closedge[each].lowcost<minVal:
minVal=closedge[each].lowcost
index=each
print(closedge[index].adjvex +' to '+node[index]+' cost '+str(closedge[index].lowcost))
closedge[index].lowcost=0
for j in range(len(closedge)):
if connected[index][j] < closedge[j].lowcost:
closedge[j].lowcost=connected[index][j]
closedge[j].adjvex=node[index]
@staticmethod
def kruskal(node,connected):
#适用于边稀疏的网
trees=[[i] for i in range(len(node))]
#边按weight排序
edge=[]
for i in range(len(node)):
for j in range(len(node)):
heappush(edge,(connected[i][j],(i,j)))
while edge:
key,value=heappop(edge)
if len(trees) <= 1:
break
a=0
b=0
for i in range(len(trees)):
if value[0] in trees[i]:
a=i
if value[1] in trees[i]:
b=i
if a != b:
print(node[value[0]]+' to '+node[value[1]]+' cost '+str(key))
trees[a]=trees[a]+trees[b]
del trees[b]
def main():
#用邻接矩阵表示图
node = ['V1','V2','V3','V4','V5','V6']
connected = [ [maxint,6,1,5,maxint,maxint],
[6,maxint,5,maxint,3,maxint],
[1,5,maxint,5,6,4],
[5,maxint,5,maxint,maxint,2],
[maxint,3,6,maxint,maxint,6],
[maxint,maxint,4,2,6,maxint] ]
print(">>>>>>>>prime")
miniSpanTree.prime(node,connected,'V1')
print(">>>>>>>>kruskal")
miniSpanTree.kruskal(node,connected)
if __name__=='__main__':
main()
结果截图: