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

生成树学习笔记

时间:2024-04-06 23:35:12浏览次数:37  
标签:联通 边权 笔记 生成 学习 集合 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/18118184

相关文章

  • 单调栈 and 单调队列学习笔记
    单调栈and单调队列学习笔记本文均以维护单调递增的栈/队列举例。本篇代码合集以后在写动态规划单调队列/单调栈优化的时候,这两个东西会合并。单调栈本质上就是模拟。假设要维护一个单调递增的栈,那么对于一个元素进来了,在栈顶的所有比他小的数我全部都要踢出去,不然就不满足......
  • 并查集学习笔记
    并查集学习笔记本质上还是一个复习笔记。考虑这样一个问题:给出\(x,y\),合并\(x,y\)所在集合。给出\(x,y\),查询\(x,y\)是否在同一集合内。我们把集合当成一棵树,两个点有连边就表示他们在同一个集合内。这棵树的根节点就是这个集合的“老大”,也就是这个集合里面的......
  • Docker学习笔记(三)Dockerfile指令详解
    文章目录FROM指定基础镜像RUN执行命令COPY复制文件ADD高级文件复制CMD容器启动命令ENTRYPOINT入口点ENV设置环境变量ARG构建参数VOLUME定义匿名卷EXPOSE声明端口WORKDIR指定工作目录USER指定当前用户HEALTHCHECK健康检查ONBUILD构建触发器LABEL添加元数据......
  • C语言学习笔记--(2)基础语法
    我先写点,我不太擅长写,所以各位有问题可以评论说,我看到一定改一.C语言编程的格式    我们可以先看一个关于C语言的基础实例下面是一个简单的C语言程序,用于计算购买商品的总价,并根据折扣计算最终支付金额。#include<stdio.h>//计算购买商品的总价floatcalculat......
  • 后端学习记录~~JavaSE篇(day03-流程控制语句-上)
    if...else与Switch...case语句一、表达式和语句表达式:(1)变量或常量+运算符构成的计算表达式(2)new表达式,结果是一个数组或类的对象。(3)方法调用表达式,结果是方法返回值或void(无返回值)。语句:(1)分支语句:if...else,switch...case(2)循环语句:for,while,do...while(3)跳转语句:brea......
  • React 学习之 Hello World
    React学习之HelloWorldReact简介React是一个用于构建用户界面的JavaScript库,由Facebook开发并维护。React通过声明式的方式来构建UI,使得代码更易于理解和测试。React的核心概念包括组件(Component)和虚拟DOM(VirtualDOM)。组件:在React中,UI被构建为组件的集合。组件是封装了HTM......
  • 2-SAT 学习笔记
    2-SAT学习笔记P4782【模板】2-SAT2-SAT问题模型:构造bool变量\(x_1,x_2...x_n\),使得满足一些限制一对\(x_1\)和\(x_2\)取值的条件合法。很显然根据Floyd传递闭包可以做到\(O(n^3+m)\),但不太行。有\(O(n+m)\)的做法,发现对于每个条件是要我们选择一种取值(选择就很......
  • 由AI生成的事业单位计算机题库
    当然可以。以下是一份针对事业单位计算机基础知识的题库,包含了不同类型的题目,旨在帮助考生全面复习和掌握计算机基础知识。选择题计算机中最小的数据单位是:A.字B.字节C.位D.千字节以下哪个设备不是输入设备?A.键盘B.鼠标C.打印机D.扫描仪......
  • [笔记]数位dp例题及详解(更新中)
    数位dp的定义引自洛谷日报#84:求出在给定区间\([L,R]\)内,符合条件\(f(i)\)的数\(i\)的个数。条件\(f(i)\)一般与数的大小无关,而与数的组成有关。由于是按位dp,数的大小对复杂度的影响很小。由于数位dp状态的上下文信息比较多,所以一般用记忆化搜索实现,而非递推。P4999烦人的数......
  • 关于LayuiAdmin单页版 点击 生成新的 tab标签页
    挠头一小时,解决一秒钟直接上代码html<buttonclass="layui-btnlayuiadmin-btn-useradmin"id="openNewTabBtn">添加</button>js layui.use(['element','table','jquery'],function(){ var$=layui.$ var......