Prim算法
图12.25 加权图 在图12.25所示的加权图中,一共有4个生成树,如图12.26所示。 图12.26 四个生成树 图12.27 最小生成树 图12.28 加权图 图12.29 找到距离集合U最近的顶点B 图12.30 找到距离集合U最近的顶点E 图12.31 找到距离集合U最近的顶点C 图12.32 找到距离集合U最近的顶点D 图12.33 图的最小生成树 该例中应用Prim算法的代码如下: 【实例12.3】 通过Prim算法查找图的最小生成树 图12.34 加权图 图12.35 打印图的最小生成树的边和顶点
01 def prim(graph,start):
01 vertex_list = ["A","B","C","D","E","F"] #顶点列表
02 tree_vertex_list = [] #最小生成树顶点列表
03 tree_vertex_list.append(start) #最小生成树第一个顶点
04 closest = [] #最小生成树顶点索引列表
05 lowcost = [] #最小生成树各顶点与其他顶点的距离
06 n = len(vertex_list) #图的顶点个数
07 index = vertex_list.index(start) #起始点的索引
08 for i in range(0,n):
09 lowcost.append(graph[index][i]) #初始化lowcost列表
10 closest.append(index) #初始化closest列表
11 for i in range(1,n): #插入n-1个顶点
12 k = 0
13 min = maxValue
14 for j in range(0,n):
15 if(lowcost[j]!=0 and lowcost[j]<min):
16 min = lowcost[j] #获取插入最小生成树的权重最小顶点的权重
17 k = j #获取插入最小生成树的权重最小顶点的索引
18 tree_vertex_list.append(vertex_list[k]) #加入最小生成树顶点列表
19 lowcost[k] = 0 #最小生成树到该顶点距离
20 for j in range(0,n):
21 if(lowcost[j]!=0 and graph[k][j]<lowcost[j]):
22 lowcost[j] = graph[k][j] #更新插入顶点后的lowcost列表
23 closest[j] = k #更新插入顶点后的closest列表
01 maxValue = float("inf") #设置最大值为无穷大
02 graph = [[0,9,maxValue,maxValue,maxValue,8,5], #图的权重列表
03 [9,0,6,maxValue,maxValue,maxValue,maxValue],
04 [maxValue,6,0,7,maxValue,maxValue,maxValue],
05 [maxValue,maxValue,7,0,13,maxValue,10],
06 [maxValue,maxValue,maxValue,13,0,12,15],
07 [8,maxValue,maxValue,maxValue,12,0,maxValue],
08 [5,maxValue,maxValue,10,15,maxValue,0]]
09 def prim(graph,start):
10 vertex_list = ["A","B","C","D","E","F","G"] #顶点列表
11 tree_vertex_list = [] #最小生成树顶点列表
12 tree_vertex_list.append(start) #最小生成树第一个顶点
13 closest = [] #最小生成树顶点索引列表
14 lowcost = [] #最小生成树各顶点与其他顶点的距离
15 n = len(vertex_list) #图的顶点个数
16 index = vertex_list.index(start) #起始点的索引
17 for i in range(0,n):
18 lowcost.append(graph[index][i]) #初始化lowcost列表
19 closest.append(index) #初始化closest列表
20 for i in range(1,n): #插入n-1个顶点
21 k = 0
22 min = maxValue
23 for j in range(0,n):
24 if(lowcost[j]!=0 and lowcost[j]<min):
25 min = lowcost[j] #获取插入最小生成树的权重最小顶点的权重
26 k = j #获取插入最小生成树的权重最小顶点的索引
27 tree_vertex_list.append(vertex_list[k]) #加入最小生成树顶点列表
28 print(vertex_list[closest[k]]+'—'+vertex_list[k]+'权重:'+str(lowcost[k]))#打印边的权重
29 lowcost[k] = 0 #最小生成树到该顶点距离
30 for j in range(0,n):
31 if(lowcost[j]!=0 and graph[k][j]<lowcost[j]):
32 lowcost[j] = graph[k][j] #更新插入顶点后的lowcost列表
33 closest[j] = k #更新插入顶点后的closest列表
34 print("最小生成树顶点:"+str(tree_vertex_list)) #打印最小生成树各顶点
35 prim(graph,"A") #调用函数并设置起始顶点为A #调用函数并设置起始顶点为A
原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/81188.html