// // // // // // // // // // // // // //

图论基础

图论基础

前言

听了一下午的课发现自己基础知识都不会 尝试重连了一下午 然而并没有什么卵用 于是就爬了 然后滚去补基础 所以就整理出了这个比收纳胶囊好不到哪里的东西


构建了一个大概的框架 可能会填

图论基础

  • 有根树
  • 无根树
  • 森林
  • 生成树
  • 深度
  • 高度
  • 子树

树的直径

  • 两次 \(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\) 的最浅的节点

posted @ 2021-07-18 20:43  Blank_space  阅读(60)  评论(0编辑  收藏  举报
// // // // // // //