首页 > 其他分享 >生成树学习笔记

生成树学习笔记

时间:2024-04-07 13:00:14浏览次数:28  
标签:联通 边权 笔记 生成 学习 集合 dis

生成树学习笔记

代码合集

很好,这还是一篇复习笔记。

考虑这么一个问题,给出一张无向图,有 \(n\) 个点,\(m\) 条边,边有边权,要你找 \(n-1\) 条边,使得这 \(n\) 个点联通且边权和最小。


Kruskal

首先,我们先把边权进行排序,然后贪心的加边,把选的边所带的点加到一个集合里面。

如果 \(x,y\) 已经连通了,这时候来了一条链接 \(x,y\) 的边,那肯定选择不加(边权和最小),那就要涉及到两个点是否在一个集合里面,显然要用并查集。

考虑用数学归纳法证明正确性。

当然,如果有图本身不连通,跑完 kuskral 以后对这些图本身的连通性不变。

因为每个点都至少有一条连边,所以每个点至少会被遍历到一次。一开始每个点所属的集合都不一样,所以一定会出现集合的合并,所以合并完以后,每个节点也都会保留至少一条连边,就保持原来图的连通了。

update in 2024.2.22

关于这样做为什么是最小的,其实考虑一条被我们舍弃的边,如果我们连他的话,最优就是在原图中再舍弃一条边,而这样的舍弃必然不优(从小到大加的)。

时间复杂度是 \(O(m \log m)\) 的。

Prim

和Dij过程很类似,采用贪心的方式。

我们把在生成树中的点的集合称之为点集,用 \(dis\) 数组维护其他点到点集的最小距离。

考虑一开始把任意一个点加入点集中。

然后我们去找到离这个集合最近的点,把这个点加入集合之中。

然后去更新周围点的 \(dis\) 值。

重复第二,第三步即可。

并且如果在集合内的话,\(dis\) 值为 \(0\),故在第二层循环选出来的点一定是不在集合内的。

如果有多个图的话,考虑采用 \(vis\),对已经进入生成树的点进行标记,然后没有标记过的点不断跑 Prim 即可,就保证每个点在所属的生成树内了。

做题情况基本已经更新,不在笔记上赘述。

Kuskral 重构树

没想到吧,一年后还会重新来搞这篇学习笔记。

在做 Kuskral 的过程中,你每次不是要合并两个集合嘛,你考虑新建一个节点,然后把两个儿子设为需要合并的两个集合,然后点权设为该边的边权。

于是你就得到了一个有 \(2\times n-1\) 个点的树,这就是Kuskral 重构树。

他的作用在于对于两个点 \(u,v\),他的 LCA 就是生成树上两个点路径中的最大值。

原因显然,你是从小到大加边的,如果 \(u\) 的联通快和 \(v\) 的联通块被一个新的点联通以后,这个点就是 \(u,v\) 的 LCA,且容易发现最大。

更重要的结论是,这个值还是原图中所有从 \(u\) 到 \(v\) 路径中的最大值的最小值。

如果你从大到小加边,那出来的就是最小值的最大值。

这两个性质是他最经常能的应用。

标签:联通,边权,笔记,生成,学习,集合,dis
From: https://www.cnblogs.com/JuneFailue/p/18118840

相关文章

  • 学习hadoop的第三天——hive搭建
    学习hadoop的第三天hive介绍hive的基本信息Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发......
  • MCE 学习笔记
    MCE学习笔记最小表示法。你说的对,月考考完了,但是感觉基本炸了。/ll/ll,相对失败。艹,写了我一个晚上。\(\frac{3}{20}\),还差的远呢。闲话:MCE是a3叫的,不过感觉挺好听。这个算法出题的话可能就比较板了,所以不是很热门?不废话了。引入定义:循环同构,对于两个字符串\(S\)......
  • Python学习(八):python面向对象编程
    文章目录python面向对象编程类的定义类的实例化类的静态变量与静态方法类的静态变量类的静态方法@staticmethod类的类方法@classmethod类的继承单继承多继承多层继承类方法的重写类方法的重载调用父类的方法super函数python面向对象编程面向对象(ObjectOriented)......
  • Python学习(七):基础运算符与表达式【详解】
    文章目录python基础运算符与表达式运算符与表达式的优先级算术运算符(四则运算)算术运算符(取余/模、乘方)关系比较运算符位运算符逻辑运算符赋值运算符、复合赋值运算符条件表达式await序列切片表达式星号表达式yield表达式lambda表达式python基础运算符与表达式运算符......
  • 实习笔记 之 components 包下文件描述
    _util:存放自定义函数AvatarList:显示头像群并支持tip(文字提示)chart:存放各种图表相关的组件,如条形图柱形图折线图等countDown:倒计时组件,该组件有3个属性:target:时间/毫秒数,必填format:该方法接收一个毫秒数的参数,用于格式化显示当前倒计时时间,非必填onEnd:倒计时结束触发......
  • 【阅读笔记】MySQL的多版本并发控制(MVCC-Multiversion Concurrency Control)
    摘自:高性能MySQL(第四版)MVCC的作用InnoDB和XtraDB存储引擎通过多版本并发控制(MVCC,MultiversionConcurrencyControl)解决了幻读的问题MVCC的应用MySQL的大多数事务型存储引擎使用的都不是简单的行级锁机制。它们会将行级锁和可以提高并发性能的多版本并发控制(MVCC)技术结合使用......
  • 实习笔记 之 前端技巧
    下拉选项滚动错位问题描述:当使用了  a-modal  或其他带有滚动条的组件时,使用  a-select  组件并打开下拉框时拖动滚动条,就会导致错位的问题产生。解决方法:大多数情况下,在  a-select  上添加一个  getPopupContainer  属性,值为 node=>node.parentNode  ......
  • uni 分享打开第三方小程序指定页面 短链生成二维码 二维码分享好友
    难点1:怎么在自己小程序拿到其他小程序短链难点2:怎么通过短链生成二维码难点3:怎么通过短链点击自动打开第三方小程序的某个页面难点4:不是通过右上角的三个点触发而是自己点击按钮进行触发分享难点5:引入第三方插件难点6:base64转小程序本地图片难点7:分享本地图片给微信好友......
  • AndroidStudio学习记录(4):单选按钮控件RadioButton
    用于应用二选一等多选选项的设置<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical">&l......
  • 深入探索MySQL:成本模型解析与查询性能优化,及未来深度学习与AI模型的应用展望
    码到三十五:个人主页在数据库管理系统中,查询优化器是一个至关重要的组件,它负责将用户提交的SQL查询转换为高效的执行计划。在MySQL中,查询优化器使用了一个称为“成本模型”的机制来评估不同执行计划的优劣,并选择其中成本最低的那个。本文将深入探讨MySQL的成本模......