PyCharm专项训练4 最小生成树算法

一、实验目的

本文的实验目的是通过编程实践,掌握并应用Prime算法和Kruskal算法来求解给定图的最小生成树问题。

二、实验内容

  1. 数据准备
    • 使用networkx库创建一个图G,并添加指定的节点和带权重的边。
  2. 算法实现
    • 实现Kruskal算法,通过构建最小生成树T,并找出构成最小生成树的边及其权重。
    • 注:虽然Prime算法在文章标题中被提及,但具体实现细节在提供的文档内容中并未展示,因此实验内容主要聚焦于Kruskal算法的实现。
  3. 结果输出
    • 打印出由Kruskal算法生成的最小生成树的边及其权重,以验证算法的正确性和有效性。

三、实验演示:

Prime算法+Kruskal算法生成最小生成树&实验截图:

python 复制代码
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})")
相关推荐
在书中成长22 分钟前
HarmonyOS 小游戏《对战五子棋》开发第18篇 - 棋盘设计
算法·harmonyos
Frostnova丶29 分钟前
(12)LeetCode 76. 最小覆盖子串
算法·leetcode·职场和发展
灯澜忆梦1 小时前
GO_函数_1
算法
言乐61 小时前
Python实现建造微服务商城后台
开发语言·python·算法·微服务·架构
凉云生烟2 小时前
机器学习 02- KNN算法
人工智能·算法·机器学习
wabs6662 小时前
关于动态规划【力扣583.两个字符串的删除操作的思考】
算法·leetcode·动态规划
可编程芯片开发2 小时前
空气流量和空气压力参数解耦系统simulink建模与仿真
算法
_Doubletful2 小时前
妙用位运算:解构汉明距离至100%(提供分析与多解)
c语言·算法·leetcode
凯瑟琳.奥古斯特2 小时前
力扣1013三等分解法与C++实现
开发语言·c++·算法·leetcode·职场和发展
Keven_112 小时前
AcWing算法提高课思路速查:搜索
算法·搜索