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})")
相关推荐
程序员东岸5 小时前
《数据结构——排序(中)》选择与交换的艺术:从直接选择到堆排序的性能跃迁
数据结构·笔记·算法·leetcode·排序算法
程序员-King.5 小时前
day104—对向双指针—接雨水(LeetCode-42)
算法·贪心算法
神仙别闹6 小时前
基于C++实现(控制台)应用递推法完成经典型算法的应用
开发语言·c++·算法
Ayanami_Reii6 小时前
进阶数据结构应用-一个简单的整数问题2(线段树解法)
数据结构·算法·线段树·延迟标记
listhi5207 小时前
基于改进SET的时频分析MATLAB实现
开发语言·算法·matlab
Keep_Trying_Go7 小时前
基于Zero-Shot的目标计数算法详解(Open-world Text-specified Object Counting)
人工智能·pytorch·python·算法·多模态·目标统计
xl.liu8 小时前
零售行业仓库商品数据标记
算法·零售
confiself8 小时前
通义灵码分析ms-swift框架中CHORD算法实现
开发语言·算法·swift
做怪小疯子8 小时前
LeetCode 热题 100——二叉树——二叉树的层序遍历&将有序数组转换为二叉搜索树
算法·leetcode·职场和发展
CoderYanger8 小时前
递归、搜索与回溯-记忆化搜索:38.最长递增子序列
java·算法·leetcode·1024程序员节