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})")
相关推荐
浊酒南街3 小时前
XGBClassifiler函数介绍
算法·机器学习·xgb
mlxg999993 小时前
hom_mat2d_to_affine_par 的c#实现
算法·计算机视觉·c#
Linzerox6 小时前
Pycharm 取消拼写错误检查(Typo:in word xxx)
python·pycharm
真就死难7 小时前
完全日期(日期枚举问题)--- 数学性质题型
算法·日期枚举
不知道取啥耶7 小时前
C++ 滑动窗口
数据结构·c++·算法·leetcode
花间流风8 小时前
晏殊几何学讲义
算法·矩阵·几何学·情感分析
@心都8 小时前
机器学习数学基础:42.AMOS 结构方程模型(SEM)分析的系统流程
人工智能·算法·机器学习
北顾南栀倾寒10 小时前
[算法笔记]cin和getline的并用、如何区分两个数据对、C++中std::tuple类
笔记·算法
一只大侠12 小时前
牛客周赛A:84:JAVA
算法
豆豆酱12 小时前
Informer方法论详解
算法