PyCharm专项训练4 最小生成树算法
一、实验目的:
本文的实验目的是通过编程实践,掌握并应用Prime算法和Kruskal算法来求解给定图的最小生成树问题。
二、实验内容:
- 数据准备:
- 使用networkx库创建一个图G,并添加指定的节点和带权重的边。
- 算法实现:
- 实现Kruskal算法,通过构建最小生成树T,并找出构成最小生成树的边及其权重。
- 注:虽然Prime算法在文章标题中被提及,但具体实现细节在提供的文档内容中并未展示,因此实验内容主要聚焦于Kruskal算法的实现。
- 结果输出:
- 打印出由Kruskal算法生成的最小生成树的边及其权重,以验证算法的正确性和有效性。
三、实验演示:
Prime算法+Kruskal算法生成最小生成树&实验截图:
import networkx as nx
import heapq
def kruskal(G):
# 创建一个空图用于构建最小生成树
T = nx.Graph()
# 边的集合,按权重排序
edges = [(weight, u, v) for u, v, weight in G.edges(data='weight')]
heapq.heapify(edges)
# 使用并查集来检测环
parent = {node: node for node in G.nodes()}
def find(node):
if parent[node] != node:
parent[node] = find(parent[node])
return parent[node]
def union(node1, node2):
root1 = find(node1)
root2 = find(node2)
if root1 != root2:
parent[root1] = root2
# 构建最小生成树
mst_edges = []
num_nodes = len(G.nodes())
num_edges_needed = num_nodes - 1
while edges and len(mst_edges) < num_edges_needed:
weight, u, v = heapq.heappop(edges)
if find(u) != find(v):
union(u, v)
T.add_edge(u, v, weight=weight)
mst_edges.append((u, v, weight))
return T, mst_edges
# 创建图并添加边
G = nx.Graph()
nodes = [0, 1, 2, 3, 4]
G.add_nodes_from(nodes)
edges = [
(0, 1, 1),
(0, 2, 3),
(0, 3, 4),
(0, 4, 7),
(1, 2, 2),
(2, 3, 5),
(2, 4, 8),
(3, 4, 6),
]
G.add_weighted_edges_from(edges)
# 找到最小生成树
T, mst_edges = kruskal(G)
# 打印最小生成树的边及其权重
print("最小生成树的边及其权重:")
for u, v, weight in mst_edges:
print(f"({u}, {v}, {weight})")
原文地址:https://blog.csdn.net/Jiangxia13/article/details/144718381
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!