$\newcommand{dfs}{\textrm{DFS}}\newcommand{lca}{\mathrm{LCA}}\newcommand{anc}{\overset+\rightarrow}\newcommand{down}{\dot\rightarrow}\newcommand{idom}{\mathrm{idom}}\newcommand{\semi}{\mathrm{semi}}$给定一张有向图 $G=(V, E)$,其中 $\lvert V \rvert=n, \lvert E \rvert=m$,以及根 $r \in V$。
我们称顶点 $x$($x \ne r$)可达,当且仅当存在一条从 $r$ 到 $x$ 的路径。
对于 $x \ne r$ 且可达的 $x$,如果 $y \ne x$,且删去 $y$ 后 $x$ 不可达,那么就说 $y$ 支配 $x$。特别地,$r$ 一定支配 $x$。
不可达的点的支配点没有定义,因此我们不妨设 $G$ 的所有顶点都可达。
我们以 $r$ 为根,进行一次深度优先遍历($\dfs$)。那么,$x$ 的支配点一定都在 $\dfs$ 树上从 $r$ 到 $x$ 的路径上,也就是 $x$ 的支配点一定是 $\dfs$ 树上 $x$ 的祖先。
我们定义 $x$ 的直接支配点 $\idom(x)$ 是 $\dfs$ 树上深度最大的支配 $x$ 的顶点。
我们构造一张新的有向图 $T=(V,E_T)$,其中 $E_T=\big\{\left< \idom(x), x\right> \big\vert x \in V\setminus\{r\}\big\}$。根据上面的结论,我们知道这张有向图是一棵以 $r$ 为根的树,称为支配树。
不难发现,一个点在支配树上的祖先集合就是其支配点集合。
求解 DAG 的支配树
按照拓扑序加入结点。
定义 $\lca S$ 表示:当前所有已经加入的结点的支配树上,顶点集合 $S$ 的所有元素的最近公共祖先。
$$\idom(x)=\begin{cases}r&\textrm{if}~\left< r, x \right> \in E;\\\lca\{\idom(y)\mid\left< y, x \right> \in E\}&\textrm{if}~\left< r, x \right> \notin E.\end{cases}$$
按照上述式子递推,用倍增求 $\lca$,时间复杂度为 $O(m\log n)$。
一般有向图支配树的 $\text{Lengauer-Tarjan}$ 算法
把顶点按以 $r$ 为根的 $\dfs$ 序标号为 $1, 2, \ldots, n$,以下不区分顶点和其标号。
设 $p_x$ 表示顶点 $x$ 在 $\dfs$ 树上的祖先($x \ne r$),$T_x$ 表示顶点 $x$ 在 $\dfs$ 树上的子树顶点集(特殊地,$x \in T_x$)。
记 $u \anc v$ 表示 $u$ 是 $v$ 在 $\dfs$ 树上的严格祖先。记 $u \down v$ 表示 $u \anc v$ 或 $u=v$。
如果顶点 $x, y$($x \ne 1$)满足存在一条路径 $y \to v_1 \to v_2 \to \cdots \to v_k \to x$ 使得 $v_1, v_2, \ldots, v_k>x$,就说 $y$ 半支配 $x$ 。
我们定义 $x$ 的半支配点 $\semi(x)$ 是 $\dfs$ 树上深度最小的半支配 $x$ 的顶点。
我们给出求解半支配点的公式:
$$\semi(x)=\min\big(\{u\mid\left< u,x \right>\in E\}\cup\{\semi(v)\mid v > x, \exists w \in V, \left< w,x \right> \in E \wedge v \anc w\}\big)$$
求解半支配点可以使用如下的算法:
设 $u$ 是满足 $\semi(x) \anc u \down x$ 上 $\semi(u)$ 最小的点。
为了计算 $\semi(x)$,我们初始时令 $\semi(x)=x$,然后依次计算 $\semi(n), \semi(n-1), \ldots, \semi(2)$。当计算 $\semi(x)$ 时,枚举 $\left<w,x\right>\in E$,查询 $\min\{\semi(v) \mid v>x \wedge v \down w\}$,这个式子显然可以使用带权并查集维护。由于当 $u<x$ 时 $\semi(u)$ 有初值 $u$,前一集合的答案可以被顺便统计。
根据半支配点,我们再给出计算 $\idom(x)$ 的公式:
$$\idom(x)=\begin{cases}\semi(x)&\textrm{if}~\semi(x)=\semi(u);\\\idom(u)&\textrm{if}~\semi(x) \ne \semi(u).\end{cases}$$
我们在逆序求解半支配点、维护带权并查集的同时,一并求解直接支配点。我们对每个点 $z$ 都维护一个列表,满足列表中的元素 $y$ 和当前处理的点 $x$ 在 $z$ 的同一个子结点的子树内,且 $\semi(y)=z$。当 $\semi(x)$ 求解完毕时,把 $x$ 放进 $\semi(x)$ 的列表,然后计算 $p_x$ 的列表内所有元素 $y$ 的 $\arg\min\{\semi(u) \mid \semi(y) \anc u \down y\}$,这样我们就能求出 $\idom(y)$ 的值,或者得出 $\idom(y)=\idom(f_y)$,其中 $f_y<y$,将 $f_y$ 记录下来,最后只需要再递推一遍就能求出具体的值。$x$ 处理完毕后需要清空 $p_x$ 的列表。
该算法时间复杂度为 $O(m \log n)$。
后记:可以通过一定技巧按秩合并,将时间复杂度降为 $O\big(m \alpha(n)\big)$。
公式的证明
引理 $1$. 如果 $u<v$,$u$ 到 $v$ 的任意路径必然经过 $u, v$ 在 $\dfs$ 树上的公共祖先。
证明:如果一条边两端没有祖先后代关系,只可能从大标号的点指向小标号的点。因此如果从 $u$ 出发不经过 $\dfs$ 树上 $u, v$ 的 $\lca$ 及其任何祖先,标号必然小于 $v$ 所在的 $\lca$ 的子结点的子树内的任何结点,因此不可能到达 $v$。
引理 $2$. $\semi(x) \anc x$。
证明:由于 $p_x$ 半支配 $x$,$\semi(x) \le p_x<x$。如果 $\semi(x) \anc x$ 不成立,任意 $\semi(x)$ 到 $x$ 的路径必然经过一个 $\semi(x)$ 和 $x$ 的公共祖先,而该公共祖先不等于 $\semi(x)$ 且小于 $x$,矛盾!因此 $\semi(x) \anc x$。
定理 $1$. $\semi(x)=\min\big(\{u\mid\left< u,x \right>\in E\}\cup\{\semi(v)\mid v > x, \exists w \in V, \left< w,x \right> \in E \wedge v \anc w\}\big)$。
证明:一方面,等式右端半支配 $x$ 是显然的,因此 $\semi(x) \le \mathrm{RHS}$。
另一方面,存在路径 $\semi(x)=v_0, v_1, \ldots, v_k=x$,其中 $v_1, v_2, \ldots, v_{k-1}>x$。
若 $k=1$,$\semi(x)$ 在前一集合中。
若 $k>1$,取最小的正整数 $j$ 使得 $v_j \down v_{k-1}$,这样的 $j$ 一定存在,因为 $v_{k-1} \down v_{k-1}$。若存在$1 \le i<j$ 使 $v_i<v_j$,根据引理 $1$,存在 $i \le t<j$ 使得 $v_t \anc v_j \down v_{k-1}$,与 $j$ 的最小性矛盾。因此对于 $1 \le i<j$,$v_i>v_j$,故 $\semi(x)$ 半支配 $v$。取 $v=v_j, w=v_{k-1}$,则 $\semi(x) \ge \semi(v)$,而 $\semi(v)$ 在后一集合中。
因此,$\semi(x)\ge\mathrm{RHS}$。
综上所述,$\semi(x)=\mathrm{RHS}$。
引理 $3$. $\idom(x) \anc x$。
证明已在文首叙述。
引理 $4$. $\idom(x)\down\semi(x)$。
证明:由于 $\idom(x)$ 和 $\semi(x)$ 都是 $x$ 的严格祖先,如果 $\idom(x)\down\semi(x)$ 不成立,则 $\semi(x)\anc\idom(x)$,于是 $\semi(x)<\idom(x)<x$。将从 $1$ 到 $\semi(x)$ 的路径和 $\semi(x)$ 经过大于 $x$ 的点到 $x$ 的路径连接,即得一不经过 $\idom(x)$ 而到达 $x$ 的路径,矛盾。
引理 $5$. 若 $v \down w$,则 $v \down \idom(w)$ 或 $\idom(w) \down \idom(v)$。
证明:设 $\idom(v) \anc x \anc v$,则存在一条从 $1$ 到 $v$ 不经过 $x$ 的路径,再接上 $v$ 到 $w$ 的树上路径得到一条从 $1$ 到 $w$ 不经过 $x$ 的路径,因此 $\idom(w) \ne x$。结合 $\idom(w) \anc w$,得 $v \down \idom(w)$ 或 $\idom(w) \down \idom(v)$。
定理 $2$. 若任意满足 $\semi(x) \anc u \down x$ 的点 $u$ 都有 $\semi(u) \ge \semi(x)$,则 $\idom(x)=\semi(x)$。
证明:由于 $\idom(x) \down \semi(x)$,只需证 $\semi(x)$ 支配 $x$。
考虑任意一条从 $1$ 到 $x$ 的路径 $1=v_1, v_2, \ldots, v_k=x$,设 $a$ 是最大的满足 $v_a<\semi(x)$ 的整数。
若不存在 $a$,则 $\semi(x)=1$ 支配 $x$。
若存在 $a$,设 $b$ 为最小的满足 $b>a$ 且 $\semi(x) \down v_b \down x$ 的整数。
对于 $a<i<b$ 有 $v_i>v_b$,否则若 $v_i<v_b$,根据引理 $1$ 存在 $i \le j <b$ 使得 $v_j \anc v_b$。根据 $a$ 的最大性,可知 $v_j \ge \semi(x)$,结合 $v_j \anc v_b$,可得 $\semi(x) \down v_j \down x$,与 $b$ 的最小性矛盾。
因此,$\semi(v_b) \le v_a<\semi(x)$,根据题设和其选取方法得 $v_b=\semi(x)$ ,由路径的任意性,得 $\semi(x)$ 支配 $x$。
故 $\idom(x)=\semi(x)$。
定理 $3$. 若 $u$ 是满足 $\semi(x) \anc u \down x$ 的点 $u$ 中 $\semi(u)$ 最小的,则 $\idom(x)=\idom(u)$。
证明:显然 $\semi(u) \le \semi(x)$。根据引理 $4$,$\idom(x)\down\semi(x) \anc u$。又因为 $u \down x$,结合引理 $5$,$\idom(x) \down \idom(u)$。因此,只需证 $\idom(u)$ 支配 $x$。
考虑任意一条从 $1$ 到 $x$ 的路径 $1=v_1, v_2, \ldots, v_k=x$,设 $a$ 是最大的满足 $v_a<\idom(u)$ 的整数。
若不存在 $a$,则 $\idom(u)=1$ 支配 $x$。
若存在 $a$,设 $b$ 为最小的满足 $b>a$ 且 $\idom(u) \down v_b \down x$ 的整数。
对于 $a<i<b$ 有 $v_i>v_b$,否则若 $v_i<v_b$,根据引理 $1$ 存在 $i \le j <b$ 使得 $v_j \anc v_b$。根据 $a$ 的最大性,可知 $v_j \ge \idom(u)$,结合 $v_j \anc v_b$,可得 $\idom(u) \down v_j \down x$,与 $b$ 的最小性矛盾。
因此,$\semi(v_b) \le v_a<\idom(u)$。
假设存在路径不经过 $\idom(u)$,则 $\idom(u) \anc v_b$。
- 若 $v_b \down \semi(x) \anc u$,则存在从 $1$ 到 $\semi(v_b)$,绕开 $\idom(u)$ 到达 $v_b$,从而到达 $u$ 的路径,与 $\idom(u)$ 是 $u$ 的直接支配点矛盾。
- 若 $\semi(x) \anc v_b \down x$,则 $\semi(v_b)<\semi(u)$ 与 $\semi(u)$ 的最小性矛盾。
综上所述,假设不成立,即 $\idom(u)$ 支配 $x$。
故 $\idom(x)=\idom(u)$。
综合以上三条定理,支配树的两条公式已经推导完毕了。
来源:https://www.cnblogs.com/nealchen/p/10124422.html