了解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
相关文章