import math
def prim( graph ):
vertex_num=len(graph)
INF = 1 << 10
visit = [False] * vertex_num
dist = [INF] * vertex_num
preIndex = [0] * vertex_num
for i in range( vertex_num ):
minDist = INF + 1
nextIndex = -1
for j in range( vertex_num ):
if dist[j] < minDist and not visit[j]:
minDist = dist[j]
nextIndex = j
visit[nextIndex] = True
for j in range( vertex_num ):
if dist[j] > graph[nextIndex][j] and not visit[j]:
dist[j] = graph[nextIndex][j]
preIndex[j] = nextIndex
return preIndex
def print_prim(map):
size=len(map)
map_graph=[[0]*size for _ in range(size)]
for i in range(size):
if i!=map[i]:
map_graph[map[i]][i]=1
map_graph[i][map[i]]=1
print(map_graph)
filename = './output.txt'
with open(filename, 'w') as file_object:
for i in range(size):
out_str=""
for j in range(i+1):
out_str=out_str+str(map_graph[i][j])
if j!=i:
out_str=out_str+" "
file_object.write(out_str+'\r\n')
def get_graph():
with open('./input.txt', 'r') as file_object:
array=file_object.read().split()
size=int(math.sqrt(len(array)))
map=[[0]*size for _ in range(size)]
for i in range(size):
for j in range(size):
map[i][j]=int(array[i*size+j])
return map
def takeThird(elem):
return elem[2]
def graph_to_edge(map):
size=len(map)
edge=[]
for i in range(size):
for j in range(i,size):
if i!=j:
#print(i,j,map[i][j])
edge.append([i,j,map[i][j]])
edge.sort(key=takeThird)
return edge
def kruskal(map):
size=len(map)
edge=graph_to_edge(map)
result=[]
s=[[i] for i in range(size)]
epoch=0
for e in edge:
#print(s)
if epoch==size-1:
break
else:
if s[e[0]] != s[e[1]]:
result.append(e)
epoch=epoch+1
for i in s[e[1]]:
if(i not in s[e[0]]):
s[e[0]].append(i)
s[i] = s[e[0]]
return result
def print_kruskal(edges):
size=len(edges)+1
map_graph=[[0]*size for _ in range(size)]
for edge in edges:
map_graph[edge[0]][edge[1]]=1
map_graph[edge[1]][edge[0]]=1
print(map_graph)
filename = './output.txt'
with open(filename, 'w') as file_object:
for i in range(size):
out_str=""
for j in range(i+1):
out_str=out_str+str(map_graph[i][j])
if j!=i:
out_str=out_str+" "
file_object.write(out_str+'\r\n')
#prim
#print_prim(prim(get_graph()))
#kruskal
print_kruskal(kruskal(get_graph()))
输入文件格式为带权图的邻接矩阵
例如
0 25 8 12 10
25 0 14 6 19
8 14 0 29 18
12 6 29 0 20
10 19 18 20 0
输出最小生成树为不带权的图的邻接矩阵
0
0 0
1 0 0
1 1 0 0
1 0 0 0 0
因为是对角矩阵,所以只用输出一半