集训游记 7.19-7.20 图论

最小生成树 MST

P5994 [PA2014] Kuglarz

考虑连边 i,j 表示花费代价知道区间 [i,j) 的奇偶性.

容易发现 i,j 联通就可以发现表示出 [i,j)

考虑最终局面,一定要推出每个 [i,i+1) 的奇偶性.要求每对 [i,i+1) 联通.即整张图联通.

最小生成树

k条白边最小生成树

二分附加权.

注意最后的方案,MST 上可能存在代价为 w 的若干条边可能是白边可能是黑边.不好判断.

考虑优先选白边.在白边数量 k 的时候记录二分答案.

  • 合法答案存在于白边 k 的时候.
  • 保证白边 k 的时候,附加权越大是一定能构造出合法答案.

树的重心

定义

  • 到所有点的带权距离之和最小的点(定义一)
  • 使得最大子树大小最小的点(定义二)

如何从定义一推出定义二呢?一个点若存在一个大小大于 n2 的子树,朝那个子树走一定会使距离和变得更小.

性质

  • 两个树相连,新重心在原来的两棵树重心的路径上.

无向图 DFS 树

u 开始搜索,遇到没有访问过的点就当自己的儿子 (1),并继续搜索.否则不管 (2)

(1) 叫做树边.
(2) 叫做非树边(返祖边).

无向图 DFS 树有一个很好的性质:一个点子树中的点互相没有边.

可以解决一些奇怪的题目.

[BZOJ4878]挑战NP-Hard

建出任一棵 DFS 树,若树深度 >k,解决 subtask 2;否则每层染不同的颜色,解决 subtask 1.

拓扑排序

最短路

严格次短路

结论:严格次短路上一定存在一条边,使得它不属于原来的 任何一条最短路.枚举次短的边是哪一条即可.
考虑最短路 DAG,若严格次短路经过的全部都是属于某一条最短路的边,它是最短路 DAG 的一条路径,它就是最短路!

换一种严谨的证明方式,记 Di 表示 1i 的最短路长度.假设一条严格次短路 Path 的所有边都存在于某一条最短路,则有 e(uv,w)Path,Dv=Du+w.那么顺序考虑 Path 中的每一个点,最后可以发现 ePathw=Dn

01 BFS

和我 基础图论 中的内容不谋而和.

当然学到了一点奇技淫巧.比如若存在 k 种边权,然后 k 很小,存在一种很轻便的空间复杂度和最短路 最长长度相关 解题方式:维护堆可以桶排开 最长最短路长度 个 vector.然后每次遍历最短路长度最短的点即可.

同余最短路

比较神仙的.

优化完全背包判定.

给定数集 S={a1,a2,a3,...,an}.每次需要判定一个数 b 是否可以被若干 S 中的元素的和表示出.每个元素可以使用多次.

S 其中任一个元素 ai 拎出来,我们只需要知道在 modai 剩余系下每个剩余类最小被凑出来的数是多少即可.

其实我感觉根本不需要证明.看上去就十分正确!

我们选择 S 中最小的数拎出来肯定最好(剩余系大小比较小).

话说 Alex_Wei 是不是有一个同余最短路的转圈技巧,没学过.

优化构图

很多时候最短路模型存在边数为枚举点对数量级的构图方式(近似完全图),边数近似 |V|2

然后我们就需要 优化构图

有两种一般的思路:

  1. 存在可以被替代(被表达)的无用边.
    比如经典的切比雪夫距离模型:点对 (i,j) 的距离为 min(|xixj|,|yiyj|).那么我们只需要按 x 排序后顺序连接相邻的边,按 y 排序连接相邻的边.因为若 xi,xj 中间存在 xk,那么距离 |xixj| 可以被 |xixk|+|xkxj| 表示.对于 y 同理.

    看似简单,实则有深意!有技巧!

    构造表达无用边的方式十分有趣.看一道例题:
    给定图 G(V,E),除了原有边集 E 以外,可以额外花费 uv 的代价从 u 走到 v.求 1n 的最短路.

    我们考虑转化 uv 的代价.其实可以看成 u 反转若干二进制位的数字.对于一个数,我们不妨只考虑反转每一个二进制位的代价.那么 uv 的代价可以表达成一条路径(先反转其中一位,然后得到新的数字,再反转另一位. . .).

  2. 从一个点出发的联边满足某种相同约束.
    比如 u 向区间 [l,r] 建边,可以使用线段树优化建边.
    据老师说一般数据结构(线段树,平衡树)优化构图无法维护 Lazy_Tag.

网络流

Dinic

复杂度:一般图 O(V2E),二分图 O(VE12)

NOI 这样的赛事网络流题目一定大概存在靠谱而保守的数据规模.用网络流水 1e5 还是量力而行吧!

网络流优化构图

其实和一般建模的优化构图还是有些不一样的.一般考虑

  • 度数为 2 的点去掉
  • 两个点之间重复的边优化成一条

问题杂技

HackerRank - Unique Colors

考虑对于每种颜色分开考虑.

对于每一种颜色,它会把整棵树分成若干个联通块:全部为颜色 c 的和不含颜色 c 的.

分开考虑:

  • 对于颜色为 c 的点,每一条经过它的路径都存在颜色 c.这样的路径一共有 n 条.

  • 对于颜色不是 c 的点 u,考虑其不经过颜色 c 的路径个数:要保证路径端点在同一个联通块中.那么从 u 出发经过颜色 c 的路径个数即 n

每一个点的答案可以这样算:

ansu=n+ccun|Sc(uSc)|=nnumber of col+ccu|Sc(uSc)|

树上差分即可.

posted @   ckain  阅读(35)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示