图论基础
图论基础
前言
听了一下午的课发现自己基础知识都不会 尝试重连了一下午 然而并没有什么卵用 于是就爬了 然后滚去补基础 所以就整理出了这个比收纳胶囊好不到哪里的东西
构建了一个大概的框架 可能会填
图论基础
树
- 有根树
- 无根树
- 森林
- 生成树
- 深度
- 高度
- 子树
树的直径
- 两次 \(dfs\)
- 树形 \(dp\)
LCA
- 倍增
- 树剖
- tarjan
- RMQ
树的重心
- \(dfs\)
树剖
- 重链剖分
- 长链剖分
- 实链剖分
然而我只会重剖
重链剖分
重链剖分通过两个 \(dfs\) 实现 树上的每个节点都属于一条重链 重链的 \(dfs\) 序是连续的 通常使用线段树维护
长链剖分
长链剖分本质上是另一种链剖分方式
定义 重儿子 表示子节点中子树深度最大的子节点(毕竟长儿子总感觉有点诡异
定义 轻儿子 表示重儿子以外的子节点
根节点到重儿子之间的边称为重边 到其他儿子的边称为轻边 重边构成的链称为重链
剖的方式的话类比重链剖分来搞就好了
一般情况下会用来优化有一维状态为深度的树上 \(dp\)
求 \(k\) 级祖先(坑)
树上启发式合并 (坑)
虚树 (坑)
只在写 \(dp\) 的时候用过 不是非常了解
树分治
- 点分治
- 边分治
- 点分树
然而我只会点分治
动态树分治 (坑)
树哈希 (坑)
拓扑排序
只会 \(DAG\) 的
对图中节点排序
最小生成树
- kruskal
- prim
- boruvka
然而我会写的只有 kruskal
严格次小生成树
在无向图中 边权和最小的满足边权和严格大于最小生成树边权和的生成树
维护严格次大边权 对每条树边 尝试以非树边替换即可
只会树剖的
瓶颈生成树
最大边权值在无向图中所有生成树中最小
最小生成树一定是瓶颈生成树 瓶颈生成树不一定是最小生成树
最小瓶颈路
这条路径上的最大的边权在所有 \(x\) 到 \(y\) 的简单路径中最小
不唯一 一般问最大边权
kruskal 重构树
跑 kruskal 的过程中从小到大加入若干条边 依照这个顺序
新建 \(n\) 个集合 每个集合中有一个节点 点权为 \(0\) 每一次加边会合并两个集合 新建一个点 点权为加入边的边权 同时将两个集合的根节点分别作为新建点的左儿子和右儿子 然后将两个集合和新建点合并成一个集合 将新建点设为根
进行 \(n - 1\) 次后得到一棵有 \(n\) 个叶子的二叉树 同时每个非叶子节点恰好有两个儿子 这棵树即为 kruskal 重构树
性质
最小生成树上两个点之间的简单路径上边权最大值为 kruskal 重构树上两点之间的 \(LCA\)
到 \(x\) 点的简单路径上边权最大值小于等于 \(val\) 的所有点 \(y\) 均在 kruskal 重构树上的某一棵子树内 且恰好为该子树的所有节点 其实就是 \(x\) 到根的路径上权值小于等于 \(val\) 的最浅的节点