当前位置: 首页 > article >正文

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

一、实验目的

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

二、实验内容

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


http://www.kler.cn/a/452126.html

相关文章:

  • 我的创作纪念日(五年)
  • 面向对象编程概念
  • 基于STM32F103控制L298N驱动两相四线步进电机
  • vulnhub靶场-matrix-breakout-2-morpheus攻略(截止至获取shell)
  • Springboot + vue3 实现大文件上传方案:秒传、断点续传、分片上传、前端异步上传
  • Rust 在前端基建中的使用
  • MySQL 数据”丢失”事件之 binlog 解析应用
  • 【Java 数据结构】移除链表元素
  • 某家政小程序系统 httpRequest 任意文件读取
  • 【ChatGPT】OpenAI 如何使用流模式进行回答
  • VSCode 插件开发实战(六):配置自定义状态栏
  • uniapp开发微信小程序笔记12-uniapp中使用Pinia
  • 【Python高级353】python实现多线程版本的TCP服务器
  • 16_HTML5 语义元素 --[HTML5 API 学习之旅]
  • Transformer 架构对比:Dense、MoE 与 Hybrid-MoE 的优劣分析
  • RAGFlow 基于深度文档理解构建的开源 RAG引擎 - 安装部署
  • Redisson 框架详解
  • FFTW基本概念与安装使用
  • Linux -- 同步与条件变量
  • 在线excel编辑(luckysheet)
  • 一网多平面
  • WhisperKit: Android 端测试 Whisper -- Android手机(Qualcomm GPU)部署音频大模型
  • clickhouse查询使用order by和limit,不同limit查询出现重复数据问题【已解决】
  • 3GPP R18 MT-SDT
  • 字符编码(三)
  • 2.系统学习-逻辑回归