⚠ 转载请注明出处:作者:ZobinHuang,更新日期:Mar.11 2022
本作品由 ZobinHuang 采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可,在进行使用或分享前请查看权限要求。若发现侵权行为,会采取法律手段维护作者正当合法权益,谢谢配合。
目录
有特定需要的内容直接跳转到相关章节查看即可。
最小生成树定义
我们将连通赋权图中权值最小的生成树 (i.e. 生成树中所有边权值的和) 称为
Kruskal 算法
- 选择边 `e_1`,使得其权值最小;
-
若已经选定边 `e_1`, `e_2`, `…`, `e_k`,则从 `E–{e_1, e_2, …, e_k}` 中选择边 `e_{k+1}`,使得:
- `G[e_1, e_2, …, e_{k+1}]` 为无圈图;
- `e_{k+1}` 的权值 `w(e_{k+1})` 尽可能小
- 当 (2) 不能进行时,停止。
Kruskal 算法下面的性质,我们这里省去证明。
破圈法
Prim 算法
上述算法的思路和我们 前面 使用 Dijkstra 算法求解最短路的思想非常相似。
根树
一些基本定义

给定一棵树 `T`,如果每条边都有一个方向,称这种树为

一棵非平凡的有向树 `T`,如果恰有一个顶点的入度为 `0`,而其余所有顶点的入度为 `1`,这样的的有向树称为
对于根树 `T`,顶点 `v` 到树根的距离称为点 `v` 的
对于根树 `T`,若规定了每层顶点的访问次序, 这样的根树称为
对于根树 `T`, 由点 `v` 及其 `v` 的后代导出的子图,称为根树的
对于根树 `T`,若每个分支点至多 `m` 个儿子, 称该根树为
对于完全 `m` 元树 `T`,有如下性质:
现在我们给出证明:一方面,由树的性质可得 `m(T) = (i+t)`;另一方面,由握手定理可得 `2 \cdot m(T) = t + m + (i-1)\cdot(m+1)`
最优二元树和霍夫曼编码
设 `T` 是一棵二元树, 若对所有 `t` 片树叶赋权值 `w_i(1 \le i \le t)`,且权值为 `w_i` 的树叶层数为 `L(w_i)`,称:
为赋权二元树的
现在我们来看

- 初始: 令 `S={w_1, w_2, …,w_i,…,w_j,…w_t}`
- 从 `S` 中取出两个权值最小者 `w_i` 与 `w_j`, 画结点 `v_i`, 带权 `w_i`, 画结点 `v_j`, 带权 `w_j`, 画 `v_i` 与 `v_j` 的父亲`v`, 连接 `v_i` 与 `v`, 连接 `v_j` 与 `v`, 令 `v` 带权 `w_i + w_j`
- 令 `S = (S−{w_i , w_j}) \cup {wi+wj}`
- 判断 `S` 是否只含一个元素, 若是, 停止, 否则转(2)