首页 > 编程语言 >PyCharm专项训练4 最小生成树算法

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

时间:2024-12-26 13:28:37浏览次数:6  
标签:node 专项 weight 生成 算法 edges PyCharm nodes

一、实验目的

本文的实验目的是通过编程实践,掌握并应用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})")

标签:node,专项,weight,生成,算法,edges,PyCharm,nodes
From: https://blog.csdn.net/Jiangxia13/article/details/144718381

相关文章

  • PyCharm专项训练5 最短路径算法
    一、实验目的    本文的实验目的是通过编程实践,掌握并应用Dijkstra(迪杰斯特拉)算法和Floyd(弗洛伊德)算法来解决图论中的最短路径问题。二、实验内容数据准备:使用邻接表的形式定义两个图graph_dijkstra和graph_floyd,图中包含节点以及节点之间的边和对应的权重。算......
  • 【数据集】【YOLO】【目标检测】灭火器识别数据集 3261 张,YOLO灭火器识别算法实战训练
     一、数据集介绍【数据集】灭火器识别数据集3261张,目标检测,包含YOLO/VOC格式标注。数据集中包含1种分类:names:['extinguisher'],表示"灭火器"。数据集图片来自国内外网站、网络爬虫、监控采集等;可用于监控和移动设备灭火器识别。检测场景为工业园区、办公大楼、居民楼......
  • 线性筛与埃氏筛算法详解
    目录线性筛与埃氏筛算法详解第一部分:线性筛与埃氏筛算法概述1.1什么是埃氏筛算法?1.2什么是线性筛算法?1.3埃氏筛与线性筛的比较1.4应用场景第二部分:埃氏筛算法原理与实现2.1埃氏筛算法原理2.2埃氏筛算法的步骤2.3埃氏筛的Python实现2.4代码解释第三部分:线性筛算......
  • 基于springboot+推荐算法的智能书店系统
    博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实实在在的写点程序。......
  • 基于EO平衡优化器算法的目标函数最优值求解matlab仿真
    1.程序功能描述基于EO平衡优化器算法的目标函数最优值求解matlab仿真。提供九个测试函数,分别对九个测试函数仿真输出最优解以及对应的优化收敛曲线。2.测试软件版本以及运行结果展示MATLAB2022A版本运行  3.核心程序whilej2<Niters%主循环进行迭代%时......
  • “高精度算法”思想 → 大数阶乘
    【“大数阶乘”算法思想】利用“高精度算法”思想计算“大数阶乘”,需要明确几个关键点:(1)数组a的大小(maxn)需要足够大,以存储阶乘结果的所有位数。(2)数组a应该在函数外部被初始化为全零,并且第一个元素应该设置为1,表示阶乘的初始值。(3)在计算过程中,数组a的每一位都会被更新......
  • 大二上 数据结构与算法 课堂模板算法 20241225
    数据结构与算法1-基本数据结构2-分治策略3-堆4-排序5-选择&树6-搜索树&散列表&并查集6.1-搜索树6.2-散列表6.3-并查集intfind(intx){if(pre[x]==x)returnx;returnpre[x]=find(pre[x]);}voidjoin(intx,inty){intfx=find(x)......
  • 常见字符串算法简记(持续更新中)
    包含KMP(border相关,KMP自动机),Manacher,Zalgorithm(exKMP),SuffixArray的简单记录。当然写的很烂,欢迎当玩笑看。0.前言1.记一忘三二本文所写的字符串算法都基于一个基本思想:充分利用已知信息的性质加速求出所求信息的过程。这是老生常谈的。因此在这些算法的复杂度分析中主要......
  • 一个GLSL Shader的格式化算法(LALR解析器)
    一个GLSLShader的格式化算法(LALR解析器)在进行OpenGL程序开发时,我需要自行解析`string`类型的Shader代码,抽取出里面的某些变量名和subroutine名。由于找不到可用的GLSLShader解析器,就照着虎书(《现代编译原理-c语言描述》)自己写了个LALRGenerator,实际上包含了(词法分析器+语法......
  • 算法备案、安全评估全网最详细流程说明【附流程+附件】
    一、“深度合成算法”与“生成合成类算法”的区别实践中,《互联网信息服务算法备案系统》显示,“生成合成类算法”与“深度合成算法”被称为一类,即“生成合成类(深度合成)算法”。因此,即使在技术层面深度合成技术与生成合成技术的或存在争议,但就算法备案实操而言,企业履行算法备案关系......