kruskal基于Python的代码实现

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档