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 的顺序加点维护并查集就行了。

浙公网安备 33010602011771号