edit existing problems

This commit is contained in:
2024-10-25 21:53:35 +08:00
parent 76e934f733
commit 0588937b51
2 changed files with 11 additions and 6 deletions
+5
View File
@@ -3,6 +3,11 @@
{
"path": "4.树上问题及图论/树上问题及图论.md",
"bookmarks": [
{
"line": 16,
"column": 13,
"label": ""
},
{
"line": 57,
"column": 15,
@@ -137,20 +137,20 @@ int LCA(int u, int v)
树链剖分用于把一棵树分割成若干条链的形式,以维护树上路径信息。
树链剖分有多种形式,如**重链剖分**,**长链剖分**和用于Link/Cut Tree的剖分(有时又称实链剖分)。在没有特殊说明的情况下,树链剖分都指的是***重链剖分***
树链剖分有多种形式,如**重链剖分**,**长链剖分**和用于 Link/Cut Tree 的剖分(有时又称实链剖分)。在没有特殊说明的情况下,树链剖分都指的是***重链剖分***
重链剖分可以将树上任意路径划分成 $\le O(log n)$ 条链,每条链上点的深度互不相同(即自底向上的一条链,所有点的LCA为链的一个端点)
### 树链剖分基本定义
- **重子节点**表示其子节点中对打的子节点。如果有多个最大的,则任取其一。
- **重子节点**表示其子节点中最大的子节点。如果有多个最大的,则任取其一。
- **轻子节点**表示除去重子节点外其他所有子节点。
- 从这个节点到重子节点的边叫做**重边**
- 到其余子节点的边叫做**轻边**
- 若干条首尾相接的重边称作**重链**
- 把最后不在重链中的节点也当作一个重链,那么整棵树便被分割为若干条重链。
整个过程可以用两次DFS完成,一边找重链,一边找落单节点
整个过程可以用两次 DFS 完成,一边找重链,一边找落单节点
举例:
@@ -163,10 +163,10 @@ int LCA(int u, int v)
- $siz(x)$ 表示 $x$ 子树节点数量
- $son(x)$ 表示 $x$ 的重儿子
- $top(x)$ 表示 $x$ 所在重链的顶部(深度最小)的节点
- $dfn(x)$ 表示 $x$ 的DFS序,也是在线段树中的编号
- $dfn(x)$ 表示 $x$ 的 DFS 序,也是在线段树中的编号
- $rnk(x)$ 表示 DFS序所对应的节点编号,显然 $rnk(dfn(x)) = x$
在进行两次dfs时,同时也处理这些值,第一次求出 $fa, dep, siz$,第二次求出 $top, dfn, rnk$
在进行两次 dfs 时,同时也处理这些值,第一次求出 $fa, dep, siz$,第二次求出 $top, dfn, rnk$
### 树链剖分基本性质
@@ -371,7 +371,7 @@ int main()
Kruskal 算法是一种常见并且好写的最小生成树算法,由 Kruskal 发明。该算法的基本思想是从小到大加入**边**。
复杂度 $O(m \log m)$,主要是排序( $m$代表边的数量)
复杂度 $O(m \log m)$,主要是排序($m$代表边的数量)
##### Kruskal部分代码