【算法基础实验】图论-最小生成树Prim的延迟实现

news2024/12/29 10:05:28

最小生成树-Prim的延迟实现

理论基础

树的基本性质

用一条边连接树中的任意两个顶点都会产生一个新的环;
从树中删去一条边将会得到两棵独立的树。

切分定理的定义

定义。图的一种切分是将图的所有顶点分为两个非空且不重叠的两个集合。横切边
是一条连接两个属于不同集合的顶点的边。
命题 (切分定理)。在一幅加权图中,给定任意的切分,它的横切边中的权重最
小者必然属于图的最小生成树。

切分定理的证明

请添加图片描述

证明。令e为权重最小的横切边,T为图的最小生成树。我们采用反证法:假设T
不包含e。那么如果将e加入T,得到的图必然含有一条经过e的环,且这个环
至少含有另一条横切边——设为f,f的权重必然大于e(因为e的权重是最小的
且图中所有边的权重均不同)。那么我们删掉f而保留e就可以得到一棵权重更
小的生成树。这和我们的假设T矛盾。

实验数据和算法流程

请添加图片描述

请添加图片描述

代码实现

import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.MinPQ;
import edu.princeton.cs.algs4.StdOut;

public class myLazyPrimMST {

    private boolean[] marked;
    private myLinkedQueue<myEdge> mst;
    private MinPQ<myEdge> pq;
    private double totalWeight;

    public myLazyPrimMST(myEdgeWeightedGraph G)
    {
        marked = new boolean[G.V()];
        mst = new myLinkedQueue<myEdge>();
        pq = new MinPQ<myEdge>();

        visit(G,0);

        while(!pq.isEmpty())
        {
            myEdge e = pq.delMin();
            int v=e.either();
            int w=e.other(v);
            if(marked[v]&&marked[w]) continue;
            mst.enqueue(e);
            if(!marked[v]) visit(G,v);
            if(!marked[w]) visit(G,w);
        }
    }

    private void visit(myEdgeWeightedGraph G, int v)
    {
        marked[v] = true;
        for(myEdge e:G.adj(v))
            if(!marked[e.other(v)])
                pq.insert(e);
    }

    public Iterable<myEdge> edges()
    { return mst; }

    public double weight()
    {
        totalWeight = 0.0;
        for(myEdge e:edges())
            totalWeight +=e.weight();
        return totalWeight;
    }

    public static void main(String[] args)
    {
        In in = new In(args[0]);
        myEdgeWeightedGraph G = new myEdgeWeightedGraph(in);
        myLazyPrimMST mst = new myLazyPrimMST(G);

        for(myEdge e:mst.edges())
            StdOut.println(e);
        StdOut.print(mst.weight());
    }
}

代码详解

这段代码实现了一个名为 myLazyPrimMST 的类,用于计算加权无向图的最小生成树(MST),采用的是 Prim 的延迟算法。下面是代码的主要功能和操作步骤的详细解释:

  1. 类变量
    • private boolean[] marked;:标记数组,用于记录图的顶点是否已被访问。
    • private myLinkedQueue<myEdge> mst;:用于存储构成最小生成树的边。
    • private MinPQ<myEdge> pq;:优先队列,用于按边的权重顺序访问边。
    • private double totalWeight;:记录最小生成树的总权重。
  2. 构造函数
    • 在构造最小生成树时,首先初始化标记数组、边队列和优先队列。
    • 从顶点0开始访问图,将其相邻的未访问边加入优先队列。
    • 循环从优先队列中取出最小边,如果这条边的两个顶点已经被标记,则忽略此边;否则,将其加入到生成树中,并访问相邻的未标记顶点。
  3. 访问顶点(visit 方法)
    • 标记顶点为已访问。
    • 遍历与顶点相连的所有边,如果边的另一端未被标记,则将该边加入优先队列。
  4. 获取生成树的边和权重
    • edges() 方法返回构成最小生成树的边。
    • weight() 方法计算最小生成树的总权重,通过遍历所有生成树的边并累加它们的权重。
  5. 主函数
    • 从文件读取图的数据构造图对象。
    • 创建 myLazyPrimMST 对象来生成最小生成树。
    • 输出生成树的所有边和总权重。

通过这种方式,myLazyPrimMST 类使用延迟的 Prim 算法有效地找到了一个给定图的最小生成树,这种算法特别适合处理稀疏图。

实验

代码编译

$ javac myLazyPrimMST.java

代码运行

代码运行输出的是计算得到的最小生成树的所有边,以及最小生成树所有边的总权重

$ java myLazyPrimMST ..\data\tinyEWG.txt
0-7 0.16
1-7 0.19
0-2 0.26
2-3 0.17
5-7 0.28
4-5 0.35
6-2 0.40
1.81

参考资料

算法(第四版) 人民邮电出版社

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1634064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

认识认识DHCP

文章目录 认识认识DHCP一、什么是DHCP&#xff1f;1.1、为什么要使用DHCP&#xff1f;1.2、DHCP是怎么工作的&#xff1f;1.2.1、客户端首次接入网络的工作原理1.2.2、客户端重用曾经使用过的地址的工作原理1.2.3、客户端更新租期的工作原理 二、配置DHCP Server&#xff0c;为…

嵌入式开发二:搭建开发环境

工欲善其事必先利其器&#xff0c;本节我们从嵌入式开发的搭建环境开始学习&#xff0c;掌握最基本的搭建环境技能&#xff0c;了解每一部分的作用&#xff0c;以及如何使用是关键所在&#xff01; 目录 一、常用开发工具简介 二、如何安装KEIL5(MDK) 2.1认识MDK-ARM 2.2 …

Spring基于AspectJ实现验签切点

文章目录 引言I AspectJ 依赖II 验签切点2.1 匹配方法执行的连接点2.2 设置带有CustomAnnotation注解的方法为切点III 案例:验签2.1 用法2.2 定义注解2.3 定义切面和切点引言 需求:验签 实现:基于AspectJ实现验签切点 I AspectJ 依赖 AspectJ 是一个基于 Java 语言的 AOP …

windos蓝屏分析工具

BlueScreenView中文版 - Windows蓝屏分析工具 BlueScreenView中文版是一款非常方便的蓝屏诊断工具。它可以帮助您快速定位蓝屏问题&#xff0c;并提供详细的故障转储信息。该软件可以自动扫描您机器上的minidump文件夹&#xff0c;同时还支持根据路径查找蓝屏文件。 windos发…

Coursera: An Introduction to American Law 学习笔记 Week 06: Civil Procedure (完结)

An Introduction to American Law Course Certificate Course Introduction 本文是 https://www.coursera.org/programs/career-training-for-nevadans-k7yhc/learn/american-law 这门课的学习笔记。 文章目录 An Introduction to American LawInstructors Week 06: Civil Pro…

Flink checkpoint 源码分析

序言 最近因为工作需要在阅读flink checkpoint处理机制&#xff0c;学习的过程中记录下来&#xff0c;并分享给大家。也算是学习并记录。 目前公司使用的flink版本为1.11。因此以下的分析都是基于1.11版本来的。 在分享前可以简单对flink checkpoint机制做一个大致的了解。 …

docker学习笔记3:VmWare CentOS7安装与静态ip配置

文章目录 一、安装CentOS71、下载centos镜像2、安装二、设置静态ip三、xshell连接centos本专栏的docker环境是在centos7里安装,因此首先需要会安装centos虚拟机。 本篇博客介绍如何在vm虚拟机里安装centos7。 一、安装CentOS7 1、下载centos镜像 推荐清华源,下载如下版本 …

【C++】学习笔记——string_1

文章目录 四、模板初阶2. 类模板 五、STL简介1. 什么是STL2. STL的六大组件3. 如何学习STL 六、string类1. string类对象的容量操作 未完待续 四、模板初阶 2. 类模板 函数模板就是&#xff1a;模板 函数&#xff1b;类模板就是&#xff1a;模板 类。和函数模板用法基本相同…

Kafka客户端工具:Offset Explorer 使用指南

Kafka作为一个分布式流处理平台&#xff0c;在大数据处理和实时数据流应用中扮演着至关重要的角色。管理Kafka的topics及其offsets对于维护系统稳定性和数据一致性至关重要。Offset Explorer是一个强大的桌面应用程序&#xff0c;它使得管理和监控Kafka集群变得简单直观。本文将…

数组 Leetcode 704 二分查找/Leetcode 59 螺旋矩阵/Leetcode 203移除链表元素

数组 Leetcode 704 二分查找 Leetcode 704 学习记录自代码随想录 二分法模板记忆&#xff0c;数值分析中牛顿迭代法 class Solution { public:int search(vector<int>& nums, int target) {int left 0, right nums.size()-1;// 是否需要等于号&#xff0c;假设…

verilog分析task的接口设计,证明这种写法:assign {a,b,c,d} = links;

verilog分析task的接口设计&#xff0c;证明这种写法&#xff1a;assign {a,b,c,d} links; 1&#xff0c;task在状态机中的使用好处&#xff1a;2&#xff0c;RTL设计3&#xff0c;测试testbench4&#xff0c;波形分析&#xff0c;正确&#xff01; 参考文献&#xff1a; 1&am…

C++初阶学习第四弹——类与对象(中)——刨析类与对象的核心点

类与对象&#xff08;上&#xff09;&#xff1a;C初阶学习第三弹——类与对象&#xff08;上&#xff09;——初始类与对象-CSDN博客 前言&#xff1a; 在前面文章中&#xff0c;我们已经讲了类与对象的思想和类与对象的一些基本操作&#xff0c;接下来这篇文章我们将讲解以下…

NLP(10)--TFIDF优劣势及其应用Demo

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 TF*IDF&#xff1a; 优势&#xff1a; 可解释性好 可以清晰地看到关键词 即使预测结果出错&#xff0c;也很容易找到原因 计算速度快 分词本身占耗时最多&#xff0c;其余为简单统计计算 对标注数据依赖小 可以使用无标注语…

超级数据查看器 app v2.0发布 欢迎下载使用

超级数据查看器 app v2.0发布 欢迎下载使用 感谢大家的支持 &#xff1a;&#xff09; 点击访问APP下载界面 跳转 腾讯应用宝 简介 超级数据查看器软件&#xff08;简称超级数据查看器&#xff09;是一个提供数据查询和数据管理的手机APP&#xff0c;能导入文本数据&…

ubuntu neo4j 下载与配置(一)

neo4j 官方下载页面 https://neo4j.com/deployment-center/#community 进入页面之后&#xff0c;往下滑 咱们在下载neo4j时&#xff0c;官方可能要咱们填写一下个人信息&#xff0c;比如&#xff1a;姓名组织结构邮箱等&#xff1a; 咱们可以观察一下&#xff0c;ne4j的下载链…

大数据学习笔记14-Hive基础2

一、数据字段类型 数据类型 &#xff1a;LanguageManual Types - Apache Hive - Apache Software Foundation 基本数据类型 数值相关类型 整数 tinyint smallint int bigint 小数 float double decimal 精度最高 日期类型 date 日期 timestamps 日期时间 字符串类型 s…

OpenAI 新推出 AI 问答搜索引擎——SearchGPT 震撼登场

您的浏览器不支持 video 标签。 OpenAI-SearchGPT 近日&#xff0c;OpenAI 曝光了自己的一款令人瞩目的 AI 问答搜索引擎——SearchGPT。这款搜索引擎带来了全新的搜索体验&#xff0c;给整个行业带来了巨大的压力。 SearchGPT 支持多种强大的功能。首先&#xff0c;它能够通过…

STM32CubeMX+MDK通过I2S接口进行音频输入输出(全双工读写一个DMA回调)续-音质问题解决总结

一、前言 之前进行了STM32CubeMXMDK通过I2S接口进行音频输入输出&#xff08;全双工读写一个DMA回调&#xff09;的研究总结&#xff1a; https://juejin.cn/post/7339016190612881408#heading-34 后续音质问题解决了&#xff0c;目前测试下来48khz的双声道使用效果很好&…

mySQL商城项目实战 (终)(全部表)(1-88张)

本章无sql语句&#xff0c;直接放转出的sql文件。 88张表结果如图! 资源在已经与文章绑定&#xff0c; 在navicat工具中&#xff0c;执行以下步骤 在新建的数据库中右键,点击【运行sql文件】&#xff0c;运行绑定的资源&#xff0c;之后您就可以在您的navicat中看到我建好的8…

Python数据分析大作业(ARIMA 自回归积分滑动平均模型) 4000+字 图文分析文档 销售价格库存分析+完整python代码

资源地址&#xff1a;Python数据分析大作业 4000字 图文分析文档 销售分析 完整python代码 完整代码分析 ​ 同时销售量后1000的sku品类占比中&#xff08;不畅销产品&#xff09;如上&#xff0c;精品类产品占比第一&#xff0c;达到66.7%&#xff0c;其次是香化类产品&#x…