图论学习笔记
圆方树
这里的圆方树指广义圆方树。
对于一张
圆方树的一些性质:
- 任取树上的一条链,其中圆点与方点交替出现。
- 两个圆点
在原图中简单路径的并等价于圆方树上 间的路径,且该路径上的圆点为 间路径的必经点。 - 顺带一提,除了两个点由一条边相连的情况,一个点双一定是一个边双。
在圆方树中,我们经常通过给每个点赋上恰当点权的方式解决问题。
例题:
铁人两项
枚举起点和终点,那么问题变为求这两点间简单路径点集的并,这等价于求圆方树上两点间间路径代表的点的并。
建立圆方树,给圆点赋
Proof:首先我们记录了路径上所有点双大小的和,但这样会算重,因为两个点双间由同一个割点相连,给圆点赋值为
然后换一种统计方式,树形 dp 求经过点
Tourists
这题 *3200
要求所有简单路径上的最小值,那么我们可以建立圆方树,圆点的权值为它自己,方点的权值为与它相连的圆点的权值的最小值,树剖加线段树维护即可。
但是这样做一个圆点的修改会影响到若干个方点,所以我们将方点的权值改为它所有子节点的权值的最小值,这样修改时只需要改父亲即可。
注意这样做如果两点间 LCA 为方点的话还要算上它的父亲。
为了方便的修改权值,我们可以对每个点开一个 multiset,得以快速维护。
战略游戏
首先答案为点集中任取两点组成的点对间路径上圆点的并集大小,这个由圆方树的性质可以直接得到,所以设圆点的权值为
但是这样做复杂度过高,考虑优化,类似于蓝书上异象石一题,将答案转化为包含集合中所有点的最小联通块,最终再减去集合的大小即可。
因此我们将这些点按照在树上的时间戳排序,然后依次统计相邻两点间的路径权值和,这里我们认为第一个点与最后一个点也相邻,这样一个点会算上两次,最后除
Edge Queries
题目中的性质没有用,将题目中的简单路径转化为圆方树上两点间的路径,然后圆点权值为
如何统计点双中边的数量呢?我们可以对一个点双中的点先打上标记,然后枚举以这个点双中的点为起点的边,如果其终点也在这个点双中,那么经过这个点双的边数加一。但因为是无向图,所以最后的边数要除二。
网络流
网络流的常用手法:拆点,总贡献减去最小割,集合划分模型,最大权闭合子图。
最大权闭合子图
若
答案是
上下界网络流
上下界网络流的基本想法是:先把所有的边流量都达到下界,然后再用减去下界得到的普通网络去调整使得每个点满足流量守恒。
1.无源汇可行流
先使每条边的权值达到下界,然后考虑求出一个
根据斜对称,
然后讲上下界同时减去下界的值得到残量网络。在这个网络上,新建一套源汇点
然后对这个图跑最大流,如果新加的这些边全部流满才有解,否则无解。比如
如果全部流满了,那么每条边的原始下界加上最新流量是一组合法的解。那虚空的
2.有源汇可行流
有源汇与无源汇的区别就是,给定的源点
虚树
应用虚树的条件:做出贡献的点只有给出的关键点和它们的 LCA,其余的点可以视作相同处理。
虚树对树的压缩保留了给出点的相对结构,但是对边权还要做出分析。
构造:使用单调栈维护虚树上的一条链,它的
按照
-
若
为栈顶,那么直接插入 即可。 -
若
不为栈顶,那么这两条路径肯定不完全重合,不断弹出栈顶直到栈顶下面的节点的 小于等于 ,假设这个点为 : -
- 若
,这意味着 ,此时只需要将栈顶弹出并连边。
- 若
-
- 若
,那么我们要先将栈顶弹出再插入 ,此时 为第一次插入, 要和栈顶连边。形象的说,就是 插在了原来的栈顶和 之间。
- 若
明显
最后栈里面还剩了一条链,依次连边。
一种更简洁的做法是:直接将点按照
P2495 [SDOI2011] 消耗战
dp 是
我们想要建出虚树,但是我们要知道一段压缩的路径上用了什么信息。
对于新树上的一条边,它所代表的原树的路径上没有关键点,我们可以从这条路径上任选一条边断掉,所以其权值应设为原路径上的最小值。
P4103 [HEOI2014] 大工程*
考虑一棵树怎么做,那么第三问是求直径,第二问是类似直径的求法那么求,第一问是统计边被计算的次数。
如果建出虚树,一条边对应着原树上的一条路径,这条路径总是被一起计算的,那么可以将新边的权值设为路径长度。
在虚树上 dp 的时候要注意直径端点必须为两个关键点,所以需要考虑一下 dp 的初值。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」