Python经典贪心算法之Prim算法案例详解
Prim算法是一种常见的最小生成树算法,它可以用于解决网络连通问题。在本文中,将讲解Prim算法的原理、Python实现以及两个示例说明。
Prim算原理
Prim算法是一种贪心算,它的核心思想是从一个点开始,每次选择一个与当前生成树距离最近的点加入生成树中。具体来说,Prim算法使用一个数组来存储每个点到生成树的距离,然后每次选择距离最小的点加入生成树中,同时更新数组中的距离。最终,我们得到的生成树就是最小生成树。
Python实现Prim算法
在Python中,我们可以使用一个二维数组来表示图,使用一个一维数组来存储每个点到生成树的距离。我们可以使用一个visited
集合来存储已经加入生成树的点,使用一个parent
数组来存储每个点在生成树中的父节点。下面是Python实现Prim算法的代码:
import sys
class Graph:
def __init__(self, vertices):
self.V = vertices
self.graph = [[0] * vertices for _ 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 primMST(self):
key = [sys.maxsize] * self.V
parent = [None] * self.V
key[0] = 0
visited = set()
for _ in range(self.V):
u = self.minKey(key, visited)
visited.add(u)
for v in range(self.V):
if self.graph[u][v] > 0 and v not in visited and key[v] > self.graph[u][v]:
key[v] = self.graph[u][v]
parent[v] = u
self.printMST(parent)
def minKey(self, key, visited):
min_val = sys.maxsize
min_idx = -1
for v in range(self.V):
if key[v] < min_val and v not in visited:
min_val = key[v]
min_idx = v
return min_idx
在这个代码中,我们使用了一个Graph
类来表示图,使用了一个二维数组graph
来存储图中的边。我们使用了一个printMST
方法来打印小生成树,使用了一个primMST
方法来实现Prim算法。我们使用了一个key
数组来存储每个点到生成树的距离,使用了一个parent
数组来存储每个点在生成树中的父节点。我们使用了一个visited
集合来存储已经加入生成的点。我们使用了一个minKey
方法来查找距离最小的点。
示例说明
示例1:求解无向图的最小生成树
在这个示例中,我们将使用Prim算法来求解无向图的最小生成树。假设我们有一个无向图,其中节点之间的距离如下所示:
2 3
(0)--(1)--(2)
| / \ |
6| 8/ \5 |7
| / \ |
(3)-------(4)
9
我们可以使用Prim算法来求解这个无向图的最小生成树,下面是Python代码:
g = Graph(5)
g.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]
]
g.primMST()
在这个代码中,我们使用了一个Graph
类来表示无向图,使用了一个二维数组graph来存储图中的边。我们使用了
primMST方法来实现Prim算法,使用了
printMST方法来打印最小生成树。我们创建了一个
Graph对象,然后调用
primMST`方法来求解最小生成树。
输出结果如下:
Edge Weight
0 - 1 2
1 - 2 3
0 - 3 6
1 - 4 5
这个结果表示无向图的最小生成树为:
2 3
(0)--(1)---(2)
| / |
6| /5 |
| / |
(3)---(4)
9
示例2:求解带权重的无向图的最小生成树在这个示例中,我们将使用Prim算法来求解带权重的无向图的最小生成树。假设我们有一个带权重的无向图,其中节点之间的距离如下所示:
2 3
(0)--(1)--()
| / \ |
6| 8/ \5 |7
| / \ |
(3)-------(4)
9
我们可以使用Prim算法来求解这个带权重的无向图的最小生成树,下面是Python代码:
g = Graph(5)
g.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]
]
g.primMST()
在这个代码中,我们使用了一个Graph
类来表示带权重的无向图,使用了一个维数组graph
来存储图中的边。我们使用了primMST
方法来实现Prim算法,使用了printMST
方法来打印最小生成树。我们创建了一个Graph
对象,然后调用primMST
方法来求解最小生成树。
输出结果如下:
Edge Weight
0 - 1 2
1 - 2 3
0 - 3 6
1 - 4 5
这个结果表示带权重的无向图的最小生成树为:
2 3(0)--(1)---(2)
| / |
6| /5 |
| / |
(3)---(4)
9
总结
本文介绍Prim算法的原理、Python实现以及两个示例说明。Prim算法是一种常见的最小生成树算法,它可以用于解决网络连通问题。在Python中,我们可以使用一个二维数组来表示图,使用一个一维数组来存储每个点到生成树的距离。我们可以使用一个visited
集合来存储已经加入生成树的点,使用parent
数组来存储每个点在生成树中的父节点。