kruskal基于Python的代码实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通信网课程设计
Project2_Kruskal算法
(基于union_find实现)
一源代码
# -*- coding: utf-8 -*-
"""
Created on Wed May 23 09:31:49 2018
@author: 15193
"""
import numpy as np
import time
start=time.clock()
class Graph(object):
def __init__(self): #初始化
self.nodes=[]
self.edge={}
def insert(self,a,b,c): #添加相应的边
if not(a in self.nodes):
self.nodes.append(a)
self.edge[a]={}
if not(b in self.nodes):
self.nodes.append(b)
self.edge[b]={}
self.edge[a][b]=c
self.edge[b][a]=c
def succ(self,a): #返回点的有关的边
return self.edge[a]
def getnodes(self): #返回点集
return self.nodes
class union_find(object): #搭建union-find数据结构
def __init__(self,size):
self.parent=[]
self.rank=[]
self.count=size
for i in range(0,size):
self.parent.append(i)
self.rank.append(1)
def find(self,i):
if self.parent[i]!=i:
self.parent[i]=self.find(self.parent[i])
return self.parent[i]
def union(self,i,j):
p=self.find(i)
q=self.find(j)
if p==q:
return False
if self.rank[p] self.rank[q]=self.rank[q]+self.rank[p] elif self.rank[p]>self.rank[q]: self.parent[q]=p self.rank[p]=self.rank[p]+self.rank[q] else: self.parent[q]=p self.rank[p]=self.rank[p]+self.rank[q] self.count=self.count-1 return True f=open('D:\graph_1.txt','r') #打开D盘的graph文件,用f表示 graph=Graph() lineList = f.readlines() length=len(lineList) #读取的行数 i=0 for line in lineList: #一行读取点的关系 if line in lineList[0]: n,m=line.split() print("该图有",n,"个点") print("该图有",m,"条边") nodes_list=np.zeros((length-1,3), dtype=np.int16) else: a,b,c=line.split() nodes_list[i,0]=a nodes_list[i,1]=b nodes_list[i,2]=c i=i+1 graph.insert(a,b,c) #将图结构的相关信息读进去 f.close() #将读取得到的图关掉 #print(graph.getnodes()) ##接下来将图中所有边的权值进行排序 nodes_list=nodes_list[nodes_list[:,2].argsort()] #按照第3列对行排序 #print(nodes_list) nodes=graph.getnodes() world=union_find(int(n)) T=0 #T作为记录MST的标志 j=0 #j作为按照降序排列的边序号 while(world.count!=1): if world.union(int(nodes_list[j,0]),int(nodes_list[j,1]))==True: T=T+nodes_list[j,2] else: pass j=j+1 print("MST:",T) end=time.clock() total_time=end-start print("总耗时:"+str(total_time)) #整个算法的运行时间 二运行时间及结果展示: Graph_0.txt Graph_1.txt Graph_2.txt Graph_3.txt