最小生成树

# -*- 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()

结果截图:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值