最小生成树是在一个给定的无向图中求一棵树T,使得这颗树拥有图G中的所有顶点,且所有边都是来自图G中的所有顶点,且所有边都是来自图G中的边,并且满足整棵树的边权和最小。
prim算法实现
def prim(graph,num):
visit=[False]*num
INF =10000
dist=[INF]*num
for i in range(num):#从0开始将和相通的点的距离存放到dist[]中
mindist = INF+1 #这两步都是为了一开始从V0开始遍历
nextnode = -1
for j in range(num):
if dist[j]<mindist and not visit[j]:
mindist = dist[j]
nextnode = j #寻找下一个节点
print (nextnode)
visit[nextnode]=True
for j in range(num):
if graph[nextnode][j]<dist[j] and not visit[j]:
dist[j]=graph[nextnode][j]
Dist = 0
print(dist)
for i in range(1,num):
Dist =Dist + dist[i]
print (Dist)
_= 10000
graph = [
[0, 10, _, _, 19,21],
[10, 0, 5, 6, _, 11],
[_, 5, 0, 6, _, _],
[_, 6, 6, 0, 18, 14],
[19, _, _, 18, 0,33],
[21, 11, _,14,33, 0],
]
prim(graph, 6)
kruskal算法
思想:每次选择图中最小边权的边, 如果边两端的顶点在不同的连通块中,就把这条边加入到最小生成树中。