支配树
定义
称有向图上 \(k\) 为 \(t\) 以 \(s\) 为源点的支配点,当且仅当 \(s\to t\) 的所有路径必须经过 \(k\),即删掉 \(k\) 后 \(s,t\) 不连通。
显然 \(t\) 的所有支配点被一条链穿过。
若连边 \(t\) 与 \(t\) 最近的支配点(\(\text{IDOM}_t\)),显然构成一棵树,称其为支配树。
对该图求出 DFS 树 \(T\),称 \(t\) 的半支配点(\(\text{SEMI}_t\))为 \(k\),存在一条路径 \(k\to c_1\to c_2\to \cdots\to t\),\(\text{DFN}_{c_i}>\text{DFN}_t\),且 \(\text{DFN}_k\) 最小,也就是 \(t\) 在反图上沿着 \(\text{DFN}>t\) 的点走,走到的 \(\text{DFN}\) 最小的点。
性质
具体性质及其证明可以见 https://www.luogu.com.cn/blog/Wankupi/solution-p5180。
补充一条:如果 \(v\) 关于 \(u\) 不是一个合法的 \(\text{SEMI}\),一定不存在一条路径不经过树边从 \(v\) 到达 \(u\)。
SEMI 求解
枚举一条边 \(v\to u\),
- 若 \(\text{DFN}_v<\text{DFN}_u\),以 \(v\) 更新。
- 否则,枚举 \(t\) 是 \(v\) 的祖先,\(\text{DFN}_t> \text{DFN}_u\),以 \(\text{SEMI}_t\) 更新。
IDOM 求解
抽出一条链 \(\text{SEMI}_u\to u\)(不包含 \(\text{SEMI}_u\)!),设 \(d\) 为这条链上 \(\text{SEMI}\) 的 DFS 序最小的结点。
- 若 \(\text{SEMI}_d = \text{SEMI}_u\),\(\text{IDOM}_u=\text{SEMI}_u\)。
- 否则有 \(\text{SEMI}_d<\text{SEMI}_u\),\(\text{IDOM}_u=\text{IDOM}_d\)。