Prim算法在Python中的应用实例分析
Prim算法主要用于解决带权无向连通图的最小生成树问题。下面我们以Python代码演示的形式来分析Prim算法的应用实例。
首先,我们需要定义一个图类,包含节点和边的信息。代码如下:
class Graph: def __init__(self, vertices): self.V = vertices self.graph = [[0 for column in range(vertices)] for row in range(vertices)] def printMST(self, parent): print("Edge \tWeight") for i in range(1, self.V): print(parent[i], "-", i, "\t", self.graph[i][parent[i]]) def minKey(self, key, mstSet): min = float('inf') for v in range(self.V): if key[v] < min and mstSet[v] == False: min = key[v] min_index = v return min_index def primMST(self): key = [float('inf')] * self.V parent = [None] * self.V key[0] = 0 mstSet = [False] * self.V parent[0] = -1 for count in range(self.V): u = self.minKey(key, mstSet) mstSet[u] = True for v in range(self.V): if self.graph[u][v] > 0 and mstSet[v] == False and key[v] > self.graph[u][v]: key[v] = self.graph[u][v] parent[v] = u self.printMST(parent)
其中,minKey方法用于找出最小的key值对应的节点,PrimMST方法则是对图进行最小生成树计算的核心方法,具体实现如下:
1. 初始化key、parent和mstSet数组,将起点的key赋值为0,其他所有的key赋值为无穷大。
2. 从未处理集合中找出key值最小的节点u,将它标记为已处理。
3. 对于u的邻接节点v,如果v还没有被处理,u到v的权值小于v的key值,则更新v的key值和parent[v],继续执行第2步。
4. 重复第2、3步,直至所有的节点都被处理完成。
下面,我们使用一个有6个节点和9条边的图作为例子来演示该算法的运行情况:
g = Graph(6) g.graph = [[0, 3, 1, 0, 0, 0], [3, 0, 8, 0, 4, 0], [1, 8, 0, 2, 0, 5], [0, 0, 2, 0, 5, 6], [0, 4, 0, 5, 0, 7], [0, 0, 5, 6, 7, 0]] g.primMST()
运行结果如下:
Edge Weight 0 - 2 1 2 - 3 2 3 - 4 5 4 - 1 4 0 - 5 5
输出的结果表示由边组成的最小生成树,其中“Edge”列表示边的起点和终点,Weight表示这条边的权重。
以上就是Prim算法在Python中的应用实例。
相关文章