定义 :
支配点(dom) : 从 S 到 之 的 必经点
最近支配点 (idom) : 其他支配点 都 支配 之 的支配点
半支配点 (sdom) : 存在 dfn 绕后路径 / 存在一条边直达 之 的点中, dfn 最小的
考虑有向图的一个生成树 (树边, 下边, 上边, 左边)
性质 :
(1) 从 dfn 序较小的点 \(\to\) dfn 序较大的点, 至少经过一个公共祖先
? prove : 左边, 上边只会继续减少 dfn. 至少得跳出 lca, 然后走 下边 才行
(2) \(idom(x)\to x\)
? prove : 若 ‘必经点‘ \(y\) 不在生成树祖先上, \(S\to x\) 则是不经过 \(y\) 的一种方案
(3) \(sdom(x)\overset{+}\to x\) \(if~x\neq S\)
? prove : \(pre[x]\) 就是满足条件的一个. 然后再根据 性质 (1)
(4) \(idom(x) \to sdom(x)\)
? prove : 否则, \(sdom(x)\leadsto x\) 就是不经过 \(idom(x)\) 的方案
(5) 不存在 \(idom(u)\overset{+}\to idom(w)\overset{+}\to u\to w\)
? prove : 因为 \(idom(u)\) 在 \(idom(w)\) 上, 说明存在方案绕过 \(idom(w)\) 到 \(u\) 的方案,
? 于是就有绕过 \(idom(w)\) 到 \(w\) 的方案.
(6) 若对于 \(\forall u, idom(w)\overset{+}\to u\to w\) :
(6.1) 都有 \(dfn[sdom(u)] \ge dfn[sdom(w)]\) , 那么 \(idom(w) = sdom(w)\)
? prove : 反证不是, 又根据性质 (4), 就有 \(idom(w)\overset{+}\to sdom(w)\) , 根据 sdom 定义, 可知
? 从 \(sdom(w)\) 上方任意一点, 都无法 \(\leadsto sdom(w)\) 下方到 \(w\) 这段路上的任意一点
? 因此必经 \(sdom(w)\)
(6.2) \(\exists u ~~s.t.~sdom(u) \lt sdom(w)\), 找到 \(dfn[sdom(u)]\) 最小的 \(u\), 有 \(idom(w) = idom(u)\)
? prove : 反证不是, 又根据性质 (5), (4), 必有 \(idom(w)\overset{+}\to idom(u)\).
? 那么假如要在 \(idom(u)\) 之上绕过 \(idom(u)\) 前往 \(w\)
? case 1 : 绕到 \(u\) 上方, 这与 \(idom(u)\) 矛盾
case 2 : 绕到 \(u\) 下方, 设绕到点 \(v\) , 那么 \(sdom(v)\le sdom(u)\) , 与假设矛盾
(7) \(sdom(x)\) 是上方直达的 或 \(u\to v\to x且path(u,v)\ge dfn[x]\) 中 \(sdom(u)\) 最小的
实现 :
(1) 先 dfs 出 dfn 序
(2) 初始化 \(sdom[x]=x\)
(3) dfn 倒序遍历
(3.1) 定义 \(eval(x)\) 为当前 \(x\) 祖先中 \(dfn[sdom(u)]\) 最小的 \(u\)
(3.2) 遍历所有可直达 \(x\) 的点, 从它们的 \(eval\) 中找到最小的, 即为当前点的 \(sdom\)
? 注意 : 枚举的点必须得S可达
(3.3) 把当前点插入 \(sdom\) 的 \(blanket\) 中
(3.4) 遍历并清空当前点父亲的 \(blanket\) , (此时 \(eval\) 就是路径最小值)
? 若满足性质 \((6.1)\) 那么设 \(idom(x) = sdom(x)\) , 否则暂时设 \(idom(x) = eval(x)\)
? 注意 : 比较上下时, 不要漏了dfn而直接比编号
(3.5) 加入这个点与其父亲的连边.
(4) dfn 正序遍历, 对于 \(idom(x) \neq sdom(x)\) 的点, 有 \(idom(x) = idom(idom(x))\)