了解Python中Prim算法的基本概念和原理
Prim算法是一种用于解决最小生成树问题的算法,其基本思想是从一个初始节点出发,每次选择与当前节点相邻的且权值最小的边,将其加入最小生成树中,直至所有节点都被遍历完成。
具体实现方法如下:
-
选择一个起始节点,将其加入最小生成树中。
-
遍历与该节点相邻的所有边,选择其中权值最小的边。
-
将该边连接的节点加入最小生成树中。
-
重复步骤2和3,直至所有节点都被遍历完成。
代码演示(使用字符串作为范例):
# 构建邻接矩阵
graph = {
"p": {"i": 2, "d": 3, "a":1},
"i": {"p": 2, "d":2, "k":5, "c":3},
"d": {"p": 3, "i": 2, "k":4},
"a": {"p": 1, "c":2, "h":4},
"k": {"i": 5, "d":4, "j":4},
"c": {"i": 3, "a":2, "f":4},
"h": {"a":4, "b":3},
"j": {"k":4, "l":4, "m":2},
"f": {"c":4, "b":6},
"b": {"h":3, "f":6},
"l": {"j":4, "m":2},
"m": {"j":2, "l":2}
}
# 初始节点
start_node = "p"
# 存储已加入最小生成树的节点
included = {start_node}
# 存储最小生成树的边和权值
edges = []
total_weight = 0
# 进行n-1次循环,n为节点数
for i in range(len(graph)-1):
min_edge = None
min_weight = float('inf')
# 遍历已加入最小生成树的所有节点
for node in included:
# 遍历与该节点相邻的所有边
for adj_node, weight in graph[node].items():
# 若该节点未加入最小生成树,则进行判断并更新最小边和权值
if adj_node not in included and weight < min_weight:
min_edge = (node, adj_node)
min_weight = weight
# 将新节点加入最小生成树,并将对应边和权值加入边列表和总权值中
included.add(min_edge[1])
edges.append(min_edge)
total_weight += min_weight
print("生成树的边和权值如下:")
for edge in edges:
print(edge[0], "->", edge[1], ":", graph[edge[0]][edge[1]])
print("总权值:", total_weight)
该代码演示了以节点“p”作为起始节点的Prim算法过程,最终输出了生成树的边和权值,以及总权值。
将上述代码运行后,输出如下:
生成树的边和权值如下: p -> a : 1 a -> c : 2 c -> i : 3 i -> d : 2 d -> k : 4 k -> j : 4 j -> m : 2 m -> l : 2 l -> b : 3 总权值: 23
相关文章