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

最小生成树-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.myMinPQ;
import edu.princeton.cs.algs4.StdOut;public class myLazyPrimMST {private boolean[] marked;private myLinkedQueue<myEdge> mst;private myMinPQ<myEdge> pq;private double totalWeight;public myLazyPrimMST(myEdgeWeightedGraph G){marked = new boolean[G.V()];mst = new myLinkedQueue<myEdge>();pq = new myMinPQ<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 myMinPQ<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.hqwc.cn/news/661444.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32进入睡眠模式的方法

#STM32进入睡眠模式的方法 今天学习了如何控制STM32进入睡眠模式&#xff0c;进入睡眠模式的好处就是省电&#xff0c;今天学习的只是浅度睡眠&#xff0c;通过中断就能唤醒。比如单片机在那一放&#xff0c;也许好几天好几个月都不用一次&#xff0c;整天的在那空跑while循环…

Stable Diffusion教程:额外功能/后期处理/高清化

"额外功能"对应的英文单词是Extras&#xff0c;算是直译。但是部分版本中的翻译是“后期处理”或者“高清化”&#xff0c;这都是意译&#xff0c;因为它的主要功能是放大图片、去噪、修脸等对图片的后期处理。注意这里边对图片的处理不是 Stable Diffusion 本身的能…

2023年蓝桥杯C++A组第三题:更小的数(双指针解法)

题目描述 小蓝有一个长度均为 n 且仅由数字字符 0 ∼ 9 组成的字符串&#xff0c;下标从 0 到 n − 1&#xff0c;你可以将其视作是一个具有 n 位的十进制数字 num&#xff0c;小蓝可以从 num 中选出一段连续的子串并将子串进行反转&#xff0c;最多反转一次。小蓝想要将选出的…

Linux修改文件权限命令 chmod

【例子引入】 以下面命令为例&#xff1a; chmod 777 Random.py 当写入下面名为Random.py的代码后&#xff1a; 如果直接运行&#xff0c;会显示权限不够 当输入 chmod 777 Random.py 更改权限后&#xff0c;才能够正常运行 在终端中输入 这条命令是关于Linux或Unix-like系…

RS0102YH8功能和参数介绍及如何计算热耗散

RS0102YH8功能和参数介绍-公司新闻-配芯易-深圳市亚泰盈科电子有限公司 RS0102YH8 是一款电平转换芯片&#xff0c;由润石&#xff08;RUNIC&#xff09;公司生产。以下是关于RS0102YH8的一些功能和参数的介绍&#xff1a; 电平转换功能&#xff1a; RS0102YH8旨在提供电平转换…

Python 中的花卉矩阵组合

使用场景描述 (rib) 协议编写脚本的基础知识。通过创建在 3D 空间中转换的基本几何图形,解决了 xyz 坐标系的基础知识。初步渲染是使用基本着色完成的,因此可以更容易地看到几何体。RenderMan 图1 图 1 是我作为作业参考的示例图片,并尝试匹配 中的图片。为了完成这项任务…

SCI一区 | MFO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测(Matlab)

SCI一区 | MFO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测&#xff08;Matlab&#xff09; 目录 SCI一区 | MFO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测&#xff08;Matlab&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现MFO-CNN…

Python 机器学习 基础 之 学习 基础环境搭建

Python 机器学习 基础 之 学习 基础环境搭建 目录 Python 机器学习 基础 之 学习 基础环境搭建 一、简单介绍 二、什么是机器学习 三、python 环境的搭建 1、Python 安装包下载 2、这里以 下载 Python 3.10.9 为例 3、安装 Python 3.10.9 4、检验 python 是否安装成功&…

JavaScript云LIS系统源码 B/S架构+SaaS模式+SQLserver可扩展性强,商业运营级区域医疗云LIS系统源码

JavaScript云LIS系统源码 B/S架构SaaS模式SQLserver可扩展性强&#xff0c;商业运营级区域医疗云LIS系统源码 云LIS&#xff08;云实验室信息管理系统&#xff09;是一种结合了计算机网络化信息系统的技术&#xff0c;它无缝嵌入到云HIS&#xff08;医院信息系统&#xff09;…

C++:运算符重载-加号(+)

在C中&#xff0c;运算符重载允许重新定义已有运算符的行为&#xff0c;以便让它们适用于自定义类型。这样&#xff0c;你可以通过自定义类型使用内置运算符&#xff0c;使得代码更加直观和易读。 此时我在代码中定义一个新类MyString&#xff1a; class MyString { public:i…

jupyter notebook导出pdf文件显示不了中文

找到文件index.tex.j2&#xff0c;我的在 C:\Users\Administrator\miniconda3\envs\opencv2\share\jupyter\nbconvert\templates\latex 我安装miniconda3并配置opencv2所需要的环境, 配置前 最后&#xff1a;用文本编辑器打开&#xff0c;修改图中article为ctexart&#xf…

滑动窗口详解

目录 一、滑动窗口的特定步骤&#xff1a; 二、题目解析 1、⻓度最⼩的⼦数组---点击跳转题目 3、最⼤连续 1 的个数 III----点击跳转题目 4、将 x 减到 0 的最⼩操作数----点击跳转题目 5、⽔果成篮----点击跳转题目 滑动窗口是双指针算法中细分的一种&#xff0c;它由暴…