数据结构与算法之 leetcode 图论最小生成树算法 Prim 算法实现

数据结构与算法阿木 发布于 5 天前 2 次阅读


图论最小生成树算法:Prim 算法实现

在图论中,最小生成树(Minimum Spanning Tree,MST)是一个非常重要的概念。它指的是在一个无向图或带权图中,包含图中所有顶点且边的权值之和最小的生成树。最小生成树在计算机科学、网络设计、数据结构等领域有着广泛的应用。本文将围绕最小生成树算法中的Prim算法进行详细介绍,并给出相应的Python实现。

Prim算法概述

Prim算法是一种用于寻找最小生成树的贪心算法。它从某个顶点开始,逐步扩展生成树,直到包含所有顶点。算法的基本思想是:每次从当前生成树中选择一个顶点,然后找到与该顶点相连的最小权值边,将这条边添加到生成树中。

Prim算法的时间复杂度为O(ElogV),其中E为边的数量,V为顶点的数量。这是因为算法需要遍历所有顶点,并对每个顶点找到最小权值边。

Prim算法步骤

1. 选择一个起始顶点v0,初始化生成树T为空。

2. 创建一个集合U,包含所有顶点,但不包含v0。

3. 创建一个数组key,用于存储从顶点v0到U中每个顶点的最小权值边。初始时,key[v] = ∞(表示无穷大),key[v0] = 0。

4. 创建一个数组pre,用于存储从顶点v0到U中每个顶点的最短路径的前驱顶点。初始时,pre[v] = -1。

5. 当U不为空时,执行以下步骤:

a. 在U中找到key值最小的顶点v。

b. 将顶点v从U移动到T中。

c. 对于T中每个与v相邻的顶点w,如果key[w] > wv,则更新key[w] = wv,并设置pre[w] = v。

6. 当U为空时,算法结束,此时T即为最小生成树。

Python实现

下面是Prim算法的Python实现:

python

def prim(graph, start):


n = len(graph)


key = [float('inf')] n


pre = [-1] n


in_tree = [False] n


key[start] = 0

for _ in range(n):


u = -1


for v in range(n):


if in_tree[v] == False and (u == -1 or key[v] < key[u]):


u = v


in_tree[u] = True


for v in range(n):


if graph[u][v] != 0 and in_tree[v] == False and graph[u][v] < key[v]:


key[v] = graph[u][v]


pre[v] = u

return pre

示例


graph = [


[0, 2, 0, 6, 0],


[2, 0, 3, 8, 5],


[0, 3, 0, 0, 7],


[6, 8, 0, 0, 9],


[0, 5, 7, 9, 0]


]


pre = prim(graph, 0)


print("最小生成树的前驱顶点序列:", pre)


总结

本文介绍了图论中最小生成树的概念,并详细讲解了Prim算法的原理和步骤。通过Python实现,我们可以看到Prim算法在寻找最小生成树方面的应用。在实际应用中,最小生成树算法可以帮助我们解决许多实际问题,如网络设计、路径规划等。希望本文对您有所帮助。