知识点

  • MST的构造
    Boruvka算法常用于解决这类问题:给你n个点,每个点有点权,任意两个点之间有边权,边权为两个点权用过某种计算方式得出,求最小生成树。动图

  • MST上的确定性和存在性问题

  • 最小生成树的两个性质:
    (1) 不同的最小生成树中,每种权值的边出现的个数是确定的
    (2) 不同的生成树中,某一种权值的边连接完成后,形成的联通块状态是一样的
    可以用这两个性质做最小生成树计数

  • Kruskal重构树

  • 令a,ba,ba,b路径上最长边最短: “最短的最长边”一定在MST上,所以我们求一下MST,再在MST上找a,ba,ba,b路径上的最长边。

  • 问nnn个点mmm条边的无向连通图上任两点的最短距离,m−nm-nm−n很小:随便建一棵生成树,把图看成树上挂几条边 CF1051F The Shortest Statement

  • trick: 对区间[l,r][l,r][l,r]操作⇒\Rightarrow⇒ 连边l→r+1l\to r+1l→r+1

CF888G Xor-MST


Boruvka + 01Trie树

Boruvka算法简介:
对图中所有的点iii,找到iii连向其它点的最小边,如果这条边还没加进MSTMSTMST,就把它加上。执行完后,把每个连通块缩成点。
不断重复上面的操作,直到只剩下一个连通块。
时间复杂度O((m+n)logn)O((m+n)logn)O((m+n)logn)

此题中,要让ai⊕aja_i \oplus a_jai​⊕aj​最小,就让ai,aja_i,a_jai​,aj​的高位尽量保持相等。
假设我们现在运行Boruvka,并且目前只剩两个连通块,那么设ppp表示所有的aaa的第1~(p−1)(p-1)(p−1)位(从高位数起)都相等,在第ppp位才出现不同。

那么在这两个连通块中一定不会有 连接i,ji,ji,j且a[i]a[i]a[i]的第ppp位和a[j]a[j]a[j]的第ppp位不同的边 ,也就是说aaa值的第ppp位为1的点构成一个连通块,aaa值的第ppp位为0的点构成一个连通块。

那么最后加入的边一定是 连接i,ji,ji,j且a[i]a[i]a[i]的第ppp位和a[j]a[j]a[j]的第ppp位不同的边,用 01Trie树 找到这样的最小边。

加完最后一条边,我们再递归回去,把aaa值的第ppp位为1的点连成一个连通块,aaa值的第ppp位为0的点连成一个连通块。

Code

CF1108F MST Unification


Blog

Code

CF733F Drivers Dissatisfaction


根据贪心,把SSS的费用全部用来降一条边的权值不比用来降多条边的权值劣。

枚举每一条边,看一下降这条边的答案是多少,最后取最优结果即可
先用Kruskal建出MST,设sumsumsum为MST里各边的权值和。

  • 如果降树边:
    答案为sum−⌊Sci⌋sum-\lfloor\frac{S}{c_i}\rfloorsum−⌊ci​S​⌋(保证降完后该边是在MST里的)

  • 如果降非树边:
    把降完权值后的非树边连上,原MST上出现一个环,我们找到环上最大的边删掉即为新的MST。
    每条非树边对应的环上最大边边权可以用倍增预处理出来。

Code

CF1416D Graph and Queries

Kruskal重构树
不会删边。所以考虑离线,按时间倒序进行操作,删边变成加边。

但是遇到的麻烦是,操作 1 是正序进行的,如果我们倒序操作,就不知道当前哪些点 pu=0p_u=0pu​=0 了。

解决方法是,先倒序遍历一遍所有操作,按“加边”的顺序,建出重构树。重构树优美的性质是,对任意一个节点 v,在某个时刻之前和它连通的节点,恰好在重构树上 v 的某个祖先的子树中。并且我们可以通过树上倍增,在 O(logn)O(logn)O(logn) 的时间内找到这个祖先。

建出重构树后,我们回到正向的时间线。按正序处理所有询问(操作 1)。前面说过,在某个时刻和 v 连通的节点,在 v 某个祖先的子树中。先倍增找到这个祖先。它的子树是 dfs 序上连续的一段。我们预处理出重构树的 dfs 序,那么问题转化为求区间最大值,支持单点修改。可以用线段树维护。

Code

CF1253F Cheap Robot

法一:
先预处理出disudis_udisu​表示uuu到最近的充电中心的距离(求多源最短路戳这)
从aaa到bbb的路径 能经过边(u→v,w)(u\to v,w)(u→v,w),当且仅当c−disu−w≥disvc-dis_u-w\geq dis_vc−disu​−w≥disv​,即disu+disv+w≤cdis_u+dis_v+w\leq cdisu​+disv​+w≤c。

那么问题变成求一条从aaa到bbb的路径使得路径上每条边的disu+disv+wdis_u+dis_v+wdisu​+disv​+w的最大值最小(明显是满足条件的最小的ccc)。

可以用Kruskal重构树实现,
也可以用NOIP2013货车运输/BZOJ3732 Network的套路实现:
“最短的最长边”一定在MST上,所以我们求一下MST,再在MST上找a,ba,ba,b路径上的最长边。

法二:
在任意两个充电中心i,ji,ji,j之间连边,边权di,jd_{i,j}di,j​为原图上i,ji,ji,j之间的最短距离。
那么ccc为新图中从aaa到bbb的路径上最长边的最小值。法一中已经解决了这个问题。

现在的问题是如何求di,jd_{i,j}di,j​,这里介绍一种剪枝方法:
先跑多源最短路,对每个点iii求出离iii最近的充电中心fif_ifi​和到fif_ifi​的最短距离disidis_idisi​,然后枚举原图中的每条边(u→v,w)(u\to v,w)(u→v,w),在新图上连边fu→fvf_u\to f_vfu​→fv​,边权w′w'w′为disu+disv+wdis_u+dis_v+wdisu​+disv​+w,
可以证明minfu→fv{w′[fu→fv]}=du,vmin_{fu\to fv}\{w'[fu\to fv]\}=d_{u,v}minfu→fv​{w′[fu→fv]}=du,v​。同样的剪枝方法见这里。

Code

CF1051F The Shortest Statement

m−n<=20m-n<=20m−n<=20,所以可以看成是一棵树上挂了几条边
树上求两点间最短距离用LCA
多出来的边怎么办?
找出所有非树边的端点记为特殊点,枚举u,v间路径过每一个特殊点的情况
(u,v路径要过非树边一定过特殊点,枚举过点的情况是因为可以用dijkstra)
因为u,v间路径只有 只过树边 和 不是只过树边 2种,所以一定不会漏(不保证不重,但没关系)

Code

CF1120D Power Tree


Blog

Code

图论复习——最小生成树MST相关推荐

  1. C语言Prims求最小生成树MST的算法(附完整源码)

    C语言Prims求最小生成树MST的算法 C语言Prims求最小生成树MST的算法完整源码(定义,实现,main函数测试) C语言Prims求最小生成树MST的算法完整源码(定义,实现,main函数测 ...

  2. 2021-06-22 离散数学图论复习笔记

    离散数学图论复习笔记 仅记了自己不太熟悉容易弄混的概念,不懂的可以回到知乎连接查看. 一.图的类型 无序对--(a,b),AB之间的线 无序积--A&B,AB之间线的集合 有序对--<a ...

  3. 图论复习之强连通分量以及缩点—Tarjan算法

    图论复习之强连通分量以及缩点-Tarjan算法                                 by RtPYH ----------------------------------- ...

  4. 数据结构实验之图论九:最小生成树_每天5分钟用C#学习数据结构(25)图 Part 6

    [基础知识]| 作者 / Edison Zhou 这是恰童鞋骚年的第221篇原创文章 上一篇介绍了非连通图如何实现遍历,本篇我们再来看看生成树与最小生成树,以及实现最小生成树的一个算法:Prim算法. ...

  5. 数据结构实验之图论九:最小生成树_初高中数学竞赛训练----图论初步2

    例题中有2019年罗马尼亚大师赛第3试题 树 树:一个连通图,如果没有一个环,则叫树. 森林:若干个独立的树形成一个森林. 链:一个特殊的树是节点中,除去两个节点的度为1,其它均为2,叫做链. 二叉树 ...

  6. 图论 —— 生成树 —— 最小生成树 —— Kruskal

    [基本思想] Kruskal 算法基本思想是并查集思想,将所有边升序排序,并认为每一个点都是孤立的,分属 n 个独立的集合. 按顺序枚举每一条边,如果这条边连接的两个点分属两个不同的集合,那么就将这条 ...

  7. 图论 —— 生成树 —— 最小生成树 —— Prim

    [基本思想] Prim 算法基本思想是蓝白点思想,用白点代表已进入最小生成树的点,蓝点代表未进入最小生成树的点. 每次循环都将一个蓝点 u 变为白点,并且此蓝点 u 与白点相连的最小边权 min[u] ...

  8. 图论复习(各类习题)

    可以结合这篇博客进行复习:http://www.cnblogs.com/z360/p/7363034.html 一.强连通分量.缩点 习题: 洛谷--P2746 [USACO5.3]校园网Networ ...

  9. `Computer-Algorithm` 最小生成树MST,Prim,Kruskal,次小生成树

    Contents 最小生成树 Algorithm Prim Code Kruskal Prim&KruskalPrim \& KruskalPrim&Kruskal算法的性质 ...

最新文章

  1. c语言存储多个数据,C语言中如何求数组真实存有数据的元素个数
  2. 最近在北京做银行软件项目亲身感受小总结
  3. Spring事务CallbackPreferringPlatformTransactionManager
  4. 手淘促活那些事儿 | 智能投放算法框架助力用户增长
  5. codeforces 758 A
  6. 学习《HTML+CSS基础课程》里的权值
  7. HDU1163 Eddy's digital Roots(解法二)【快速模幂+九余数定理】(废除!!!)
  8. 阿里云镜像加速Docker
  9. Windows 下USB被禁用
  10. excel字符串和单元格拼接_Excel工作表中带单位求和的4个技巧,不掌握就真的Out了!...
  11. iconv linux 开源代码,每天一个 Linux 命令(123):iconv 命令
  12. 【OpenGL】各向异性过滤案例
  13. java黑洞数字_Java中实现数字黑洞的示例
  14. 矩阵键盘——按下矩阵按键,数码管显示出位置对应的字符(0123 4567 89Ab CdEF)
  15. 复制粘贴技巧,全选快捷键ctrl加什么?
  16. macOS - afconvert 命令(音频格式转换)
  17. PHP中文转拼音及提取首字母
  18. 微信最强花式操作,带你玩转 wxpy
  19. hackthebox-optimum(考点:hfs/windows)不用msf
  20. 智能ABC输入法的巧用

热门文章

  1. android shell用户界面,shell界面下安装和卸载Android应用程序(apk包)
  2. linux 端口qos,linux的qos机制 - cgroup篇 (2)
  3. 离线语音识别软件_从音乐识别软件起家,这家公司如何备战车载AI语音市场GGAI对话...
  4. java xml 追加,java – 如何将节点从xml文档追加到现有的xml文档
  5. Java使用TCP实现群聊 聊天室(多线程和tcp的使用)
  6. [C++11]函数模板的默认模板参数
  7. [蓝桥杯2016初赛]冰雹数-模拟
  8. 数据结构与算法--图论-深度优先搜索及其应用
  9. with grant option mysql_mysql用户及权限(WITH GRANT OPTION)
  10. 网络时延——发送时延和传播时延