graph = {
0: {1: 4, 7: 8},
1: {2: 8, 7: 11},
2: {8: 2, 5: 4, 3: 7},
3: {4: 9, 5: 14},
4: {5: 10},
5: {6: 2},
6: {7: 1, 8: 6},
7: {8: 7}
}
def init_edges(G):
edges=[]#用个列表存储
#无向图邻接矩阵
for i in G.keys():
for j in G[i].keys():
edges.append((i,j,G[i][j]))
edges.append((j,i,G[i][j]))
return edges
def graph_prim(G):
visit_node=[list(G.keys())[0]]#将第一个点添加入
route=[]
edges=init_edges(G)
visit_edge=[]
#所有的结点都必须访问
while(len(visit_node)<=len(G.keys())):
for i in edges:
#每次找最后一个结点
if i[0]==visit_node[-1]:
visit_edge.append(i)
#按边的权重从大到小排序。
visit_edge.sort(key=lambda x:x[-1],reverse=True)
while True:
#如果当前访问的最小结点权值的结点没有被反问过
if visit_edge[-1][1] not in visit_node:
#将其加入并且添加入对应route中
visit_node.append(visit_edge[-1][1])
route.append(visit_edge.pop())
break
else:
#如果被访问过了,那么这个边就没用了,直接pop
visit_edge.pop()
return route
def print_route_steps(route):
total_weight = 0
for step in route:
print(f"从 {step[0]} 到 {step[1]},权重为 {step[2]}")
total_weight += step[2]
print(f"总路线: {[(step[0], step[1]) for step in route]}")
print(f"总权重: {total_weight}")
if __name__=="__main__":
route=graph_prim(graph)
print_route_steps(route)
最小生成树的Prim算法实现
最新推荐文章于 2024-08-12 16:55:46 发布