Kruskal重构树学习笔记(C++)

news2025/1/1 10:55:26

Kruskal重构树学习笔记

提示:

学习Kruskal重构树之前建议先了解一下Kruskal算法,虽然不了解这个影响不会很大

一定要了解一下并查集的算法

接下来如果想要应用Kruskal重构树,一定要了解一下LCA算法

什么是Kruskal重构树

这里先简单说明一下Kruskal算法:

Kruskal算法依托于并查集算法实现

一张图的边排序,从小到大依次将每一条边加入最小生成树,如果加入后会形成环,则不加入

Kruskal重构树的算法与其基本一致:

Kruskal重构树算法依托于并查集算法实现

(这里文字描述可能优点绕口,建议先看图再回来看文字)

一张图的边排序,从小到大依次尝试每一条边

将边的两个节点的根节点(当一棵树只有一个节点时,它就是自己的根节点)连接到一个新创建节点上

赋予新创建节点权值,权值等于这条边的边权

循环,直至形成一棵树(所有点都在一个集合中)

这里写图片描述

*注:上图来自CSDN博主wu_tongtong:http://blog.csdn.net/wu_tongtong

第一次合并,1和4间边权最小,合并1和4

在这里插入图片描述

第二次合并,3和6间边权最小,合并3和6

第三次合并,1和2间边权最小,合并2和1的根节点
在这里插入图片描述

第四次合并,5和4间边权最小,合并5和2的根节点
在这里插入图片描述

Kruskal重构树的性质

1、二叉树

2、原树两点间路径上边权的最大值 = 新树两点间路径上点权的最大值

也就是说原树中两点之间路径上边权的最大值等于新树上两点的LCA的点权

3、子节点的点权小于等于父节点(大根堆)

Kruskal重构树的实现

讲解完了思路,接下来实现具体的代码

void exKruskal(int n) {
	edge t;
	int u, v;
	while (!p_q.empty()) {//p_q为优先队列(小根堆)
		t = p_q.top();
		p_q.pop();//取出最短边
		u = t.u; v = t.v;
		if (is_in_same(u, v)) continue;//会形成环
		//不会形成环
		n++;//从n + 1开始分配
		fa[n] = fa[u] = fa[v] = n;
		son[n][0] = u; son[n][1] = v;//连接
		value[n] = t.p;//赋值
	}
}

这个只是便于理解的版本,实现方式多种多样,这里不一一列举

Kruskal重构树例题

1、P1967[NOIP2013 提高组] 货车运输

2、P2245 星际导航

3、P4197 Peaks

4、P4768 [NOI2018] 归程

(已按难度升序排序,洛谷中每道题都有相应的题解)

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

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

相关文章

exec函数族详解

文章目录exec介绍exec族execl函数execlp函数execv函数exec介绍 通过命令查看帮助:man 3 exec exec 函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。…

基于多线程版本的定时器

定时器 1)咱们前面学习过的阻塞队列,相比于普通的队列线程安全,相比于普通的队列起到一个更好的阻塞效果 2)虽然使用阻塞队列,可以达到销峰填谷这样的一个效果,但是峰值中有大量的数据涌入到队列中,如果后续的服务器消…

教程:Flutter 和 Rust混合编程,使用flutter_rust_bridge自动生成ffi代码

实践环境:Arch Linuxflutter_rust_bridge官方文档Flutter环境配置教程 | Rust环境配置教程记录使用flutter_rust_bridge遇到的一些坑。假设已经我们配置了Fluuter与Rust环境现在直接使用flutter_rust_bridge模板创建自己的项目运行:git clone https://gi…

W13Scan 扫描器挖掘漏洞实践

一、背景 这段时间总想捣鼓扫描器,发现自己的一些想法很多前辈已经做了东西,让我有点小沮丧同时也有点小兴奋,说明思路是对的,我准备站在巨人的肩膀去二次开发,加入一些自己的想法,从freebuf中看到W13Scan…

进程调度模块

目录 1.进程介绍 2.进程调度 2.1.进程状态 2.2.进程调度函数 ---schedule 2.3.进程切换函数 ---switch_to() 1.进程介绍 在进程模块里面,我们知道了进程就是一个task_struct的结构体,里面含有进程的各种信息。进程存放在进程…

AppScan被动手动探索扫描

系列文章 AppScan介绍和安装 AppScan 扫描web应用程序 第三节-AppScan被动手动探索扫描 被动式扫描:浏览器代理到AppScan,然后进行手工操作,探索产生出的流量给AppScan进行扫描。 他的优点是:扫描足够精准,覆盖率更…

注册中心和负载均衡(黑马SpringCloud笔记)

注册中心和负载均衡 目录注册中心和负载均衡一、服务远程调用1. RestTemplate2. 服务调用关系3. 远程调用的问题二、注册中心1. Eureka注册中心1.1 搭建Eureka注册中心1.2 服务注册1.3 服务拉取1.4 小结2. nacos注册中心2.1Nacos搭建2.2 服务注册2.3 服务拉取2.4 服务分级存储模…

虹科新闻 | 虹科与丹麦Eupry正式建立合作伙伴关系

近期,虹科与丹麦Eupry正式建立合作伙伴关系。未来,虹科与Eupry将共同关注最具创新性和稳定性的解决方案,为客户提供温度记录仪、温湿度记录仪、Mapping温度分布验证服务、以及基于云的温湿度自动监测系统。 虹科非常高兴欢迎并宣布我们的新合…

【Linux】基础:进程信号

【Linux】基础:进程信号 摘要:本文将会从生活实际出发,由此掌握进程信号的学习过程,分别为信号的产生、信号的传输、信号的保存和信号的处理,最后再补充学习信号后方便理解的其他概念。 文章目录【Linux】基础&#xf…

echarts柱状图值为0时不显示以及柱状图百分比展示

echarts柱状图值为0时不显示以及柱状图百分比展示 1.效果展示 2.代码 <template><div id"container"><div id"main"></div></div> </template> <script>import * as echarts from echarts import * as lodash…

(JVM)浅堆深堆与内存泄露

​浅堆深堆与内存泄露 1. 浅堆&#xff08;Shallow Heap&#xff09; 浅堆是指一个对象所消耗的内存。在 32 位系统中&#xff0c;一个对象引用会占据 4 个字节&#xff0c;一个 int 类型会占据 4 个字节&#xff0c;long 型变量会占据 8 个字节&#xff0c;每个对象头需要占用…

01.【Vue】Vue2基础操作

一、Vue Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一方面&…

十五天学会Autodesk Inventor,看完这一系列就够了(七),工程图纸

众所周知&#xff0c;Autocad是一款用于二维绘图、详细绘制、设计文档和基本三维设计&#xff0c;现已经成为国际上广为流行的绘图工具。Autodesk Inventor软件也是美国AutoDesk公司推出的三维可视化实体模拟软件。因为很多人都熟悉Autocad&#xff0c;所以再学习Inventor&…

自动化测试 | 这些常用测试平台,你们公司在用的是哪些呢?

本文节选自霍格沃兹测试学院内部教材 测试管理平台是贯穿测试整个生命周期的工具集合&#xff0c;它主要解决的是测试过程中团队协作的问题。在整个测试过程中&#xff0c;需要对测试用例、Bug、代码、持续集成等等进行管理。下面分别从这四个方面介绍现在比较流行的管理平台。…

Spring入门-SpringAOP详解

文章目录SpringAOP详解1&#xff0c;AOP简介1.1 什么是AOP?1.2 AOP作用1.3 AOP核心概念2&#xff0c;AOP入门案例2.1 需求分析2.2 思路分析2.3 环境准备2.4 AOP实现步骤步骤1:添加依赖步骤2:定义接口与实现类步骤3:定义通知类和通知步骤4:定义切入点步骤5:制作切面步骤6:将通知…

Anaconda+VSCode配置tensorflow

主要参考https://blog.csdn.net/qq_42754919/article/details/106121979vscode的安装以及Anaconda的安装网上有很多教程&#xff0c;大家可以自行百度就行。在安装Anaconda的时候忘记勾选自动添加path&#xff0c;需要手动添加环境变量path下面介绍tensorflow安装教程:1.打开An…

getRequestDispatcher()转发和sendRedirect()重定向介绍与比较

文章目录1. request.getRequestDispatcher()1.1请求转发和请求包含的区别1.2request域2.response.sendRedirect()3.请求转发与重定向的区别比较测试1. request.getRequestDispatcher() getRequestDispatcher()包含两个重要方法&#xff0c;分别是请求转发和请求包含。一个请求…

系分 - 案例分析 - 系统设计

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录系分 - 案例分析 - 系统设计结构化设计SD内聚偶然内聚逻辑内聚时间&#xff08;瞬时&#xff09;内聚过程内聚通信内聚顺序内聚功能内聚耦合内容耦合公共耦合外部耦合控制耦合标记耦合数据耦合非直接耦合补…

DTO 与 PO的相互转换

目录 常见Bean映射框架 Dozer Orika MapStruct ModelMapper JMapper 测试模型 转化器 OrikaConverter DozerConverter MapperStructConvert JMapperConvert ModelMapperConverter 测试 平均时间 吞吐量 SingleShotTime 采集时间 DTO&#xff08;Data Transfer …

Android项目Gadle统一依赖管理

一.Gradle管理依赖版本 在中大型Android项目中&#xff0c;都会有多个Module进行协同配合。这些module中可能会依赖同一个库的不同版本&#xff0c;这将导致一些问题&#xff0c;要么是代码冲突&#xff0c;要么是APK包体积增大&#xff0c;亦或是项目构建的时间变长&#xff…