Elimination Tree 学习笔记

首先 Elimination tree 是针对于“结构对称矩阵”才有的概念。“结构对称”指的是非零元素的位置对称。

首先,高斯消去过程的精髓在于:对于矩阵 \(\begin{bmatrix}u_{kk} & r^T\\c & B\end{bmatrix}\),进行一次消去,操作是 \(B\leftarrow B-{1\over u_{k k}} c r^T\)

对应到单个元素 \(A_{ij}\) 上,就是对于每个 \(k< \min(i,j)\),要有 \(A_{i j}\leftarrow A_{ij}-L_{ik}R_{kj}\)

对应到填入现象:从小到大看 \(k\),若 \((k,i),(k,j)(k< \min(i,j))\) 边均存在,则添加上边 \((i,j)\)

把问题静态化:最终的 \(L\) 矩阵中 \(L_{ji}\ne 0\),当且仅当原图中 \(i,j\) 可以通过小于 \(\min(i,j)\) 的点互相连通。

我们想刻画一个点 \(i\) 能否到达一个点 \(j\),其中 \(i<j\)

事实上,我们只用考虑 \(i\) 能到达的比他大的最小的点 \(l\),容易发现 \(i\) 能到的点,\(l\) 也一定能到(因为 \(l\) 可以先走到 \(i\) 再走到那个点)。

于是把 \(l\) 记作 \(i\) 的父亲,就形成了 elimination tree,若 \(i\) 能到达 \(j\),那么由上可知从 \(i\) 一直跳父亲一定能到达 \(j\)

我们现在想借助 elimination tree 找出所有能抵达的对子 \((i,j)\)。注意 \(j\)\(i\) 的祖先不能推出 \(i\) 能到达 \(j\)

事实上,枚举 \(i\) 找能到达的 \(j\) 比较困难。反过来看,我们枚举 \(j\),看哪些 \(i\) 能到达 \(j\)

考虑 \(j\) 旁边的所有比 \(j\) 小的点 \(l_1,l_2,\dots\),那 \(i\) 要到 \(j\) 一定得经过某个 \(l_*\),那么 \(i\)\(l_*\) 存在一条中间点全部小于 \(i\) 的路径,这意味着 \(l_*\) 不断跳父亲,在到达 \(j\) 之前一定会经过 \(i\)

于是对于 \(j\),枚举旁边比 \(j\) 小的点 \(l_*\),那么 etree 上所有 \(l_*\)\(j\) 的路径并就是能到达 \(j\) 的点的集合!

至于 etree 本身的构建,其实它就是按点权的 kruskal 重构树,直接按 1 到 n 的顺序加点维护并查集就行了。

posted @ 2026-09-01 00:55  CharlieVinnie  阅读(8)  评论(0)    收藏  举报