Lengauer-Tarjan算法的相关证明
Lengauer-Tarjan算法的相关证明
0. 约定
为简单起见,下文中的路径均指简单路径(事实上非简单路径不会对结论造成影响)。
\(V\)代表图的点集,\(E\)代表图的边集,\(T\)代表图的DFS树。
\(a \to b\)代表从点\(a\)直接经过一条边到达点\(b\)(即\((a, b) \in T\)),
\(a \leadsto b\)代表从点\(a\)经过某条路径到达点\(b\),
\(a \dot \to b\)代表从点\(a\)经过\(T\)的树边到达点\(b\)(在\(T\)上\(a\)是\(b\)的祖先),
\(a \overset{+} \to b\)代表\(a \dot \to b\)且\(a \ne b\)。
这4种符号也同时表示路径。
1. 基本介绍 支配树(Dominator Tree)
\(G = (V, E, r)\)为点集为\(V\),边集为\(E\),起点为\(r\)的流程图。如果一个从\(r\)到\(w\)的所有路径都经过\(v\),那么称\(v\)支配\(w\),\(v\)是\(w\)的支配点。如果\(v\)是\(w\)的支配点,且\(w\)的其他所有支配点均支配\(v\),那么称\(v\)是\(w\)的直接支配节点(immediate dominator),记作\(idom(w) = v\)。
定理1. 图\(G\)中除点\(r\)外其他所有点都有唯一的直接支配节点。点集\(V\)和边集\(\{ (idom(w), w) | w \in V - \{r\} \}\)组成了一棵以点\(r\)为根的有向树,称为图\(G\)的支配树(Dominator Tree)。点\(v\)支配点\(w\)当且仅当在支配树上点\(v\)是点\(w\)的祖先。
2. 支配树相关性质
首先,我们从起点\(r\)对图\(G\)进行DFS,得到了一棵DFS树\(T\)。原图\(G\)中的边\((u, v)\)就分为了树边\(( (u, v) \in T)\)和非树边\(( (u, v) \notin T)\)。非树边还可以分为前向边(\(u\)是\(v\)的祖先),后向边(\(u\)是\(v\)的后代),横叉边(\(u, v\)非祖先后代关系)。
我们通过DFS序比较两个点的大小关系。那么前向边\((u, v)\)满足\(u < v\),后向边\((u, v)\)满足\(u > v\),横叉边\((u, v)\)满足\(u > v\)。
接下来给出一些有关支配树算法的重要引理。
引理1.(路径引理) 如果图\(G\)的两个点\(v, w\)满足\(v \le w\),那么点\(v\)到点\(w\)任意路径一定经过点\(v\)和点\(w\)的某个在树\(T\)上的公共祖先(至少一个)
证明: 如果\(v\)是\(w\)的祖先,结论显然成立(必然经过点\(v\))。否则\(v, w\)非祖先后代关系,令\(p\)为\(LCA(u, v)\),显然\(p \ne v \ and \ p \ne w\)。删掉从起点\(r\)到\(p\)的路径上的所有点(这些点是\(v, w\)的公共祖先),那么\(v\)和\(w\)在以\(p\)为根两棵子树内,并且因为公共祖先被删去,无法通过后向边到达子树外面,前向边也无法跨越子树,而横叉边只能从大到小(\(v\)所在子树内的点均大于\(w\)所在子树内的点),所以从\(v\)出发不能离开这颗子树到达w。所以如果本来\(v\)能够到达\(w\),就说明这些路径必须经过\(v, w\)的公共祖先。
一个小推论: 如果图\(G\)的两个点\(v, w\)满足\(v \lt w\),那么点\(v\)到点\(w\)任意路径一定经过点\(w\)的某个在树\(T\)上的真祖先(至少一个)。
对于图\(G\)中的点\(w\)(\(w \ne r\)),定义它的半支配点(semi-dominator)\(sdom(w) = \min \{ v | \exists (v_0, v_1, \cdots, v_{k - 1}, v_k), v_0 = v, v_k = w, \forall 1 \leq i \leq k - 1, v_i \gt w \} \tag{1}\)
半支配点有很多性质,使得它们的计算成为支配点计算中的一个方便的中间步骤。对于任意点\(w\)(\(w \neq r\)),\(sdom(w)\)是\(w\)在树\(T\)上的真祖先,\(idom(w)\)是\(sdom(w)\)在树\(T\)上的祖先。如果把图\(G\)中的树边边集替换为边集\(\{ (sdom(w), w) | w \in V \ and \ w \neq r \}\),在新图\(G'\)中的所有点的支配点并不会改变。因此如果我们知道了DFS树和半支配点,我们可以计算出支配点。
以下将证明半支配点的这些性质。接下来的引理给出了DFS树,半支配点和支配点之间一般关系。
引理2. 对于任意点\(w\)(\(w \ne r\)),有\(idom(w) \overset{+}{\to} w\)。
证明: 显然,如果不是这样的话就可以直接通过树边不经过\(idom(w)\)就到达\(w\)了,与\(idom\)定义矛盾。
引理3. 对于任意点\(w\)(\(w \ne r\)),有\(sdom(w) \overset{+}{\to} w\)。
证明: 对于\(w\)在树\(T\)上的父亲\(fa_w\),\(fa_w \to w\)这条路径只有两个点,所以满足\(sdom\)定义中的条件,于是它是\(sdom(w)\)的一个候选,所以\(sdom(w) \le fa_w\),就有\(sdom(w) \lt w\)。根据引理1(路径引理)可以证明\(sdom(w)\)不可能在另一棵子树,因为如果是那样的话就至少会经过\(w\)的一个真祖先,\(w\)的真祖先小于\(w\),与\(sdom(w)\)的定义矛盾,于是\(sdom(w)\)就是\(w\)的真祖先。
引理4. 对于任意点\(w\)(\(w \ne r\)),有\(idom(w) \dot \to sdom(w)\)。
证明: 如果不是这样的话,按照\(sdom\)的定义,就会有一条路径是\(r \dot \to sdom(w) \leadsto w\)不经过\(idom(w)\)了,与\(idom\)的定义矛盾。
引理5. 对于满足\(v \dot \to w\)的点\(v, w\),有\(v \dot \to idom(w)\)或\(idom(w) \dot \to idom(v)\)。
证明: 如果\(v = w\)显然成立。否则,如果不是这样的话,就是\(idom(v) \overset{+}{\to} idom(w) \overset{+}{\to} v \overset{+}{\to} w\),那么存在路径\(r \dot \to idom(v) \leadsto v \overset{+}{\to}w\)不经过\(idom(w)\)到达了\(w\)(因为\(idom(w)\)是\(idom(v)\)的真后代,一定不支配\(v\),所以存在绕过\(idom(w)\)到达\(v\)的路径),与\(idom\)的定义矛盾。
通过引理1-5,我们获得了能提供从半支配点计算支配点的方法的两个结论。
定理2. 对于任意点\(w\)(\(w \ne r\)),如果所有满足\(sdom(w) \overset{+}{\to} u \dot \to w\)的\(u\)也满足\(sdom(u) \ge sdom(w)\),即\(sdom(w) \dot \to sdom(u) \overset{+}{\to} u \dot \to w\),那么\(idom(w) = sdom(w)\)。
证明: 由引理4知道\(idom(w) \dot \to sdom(w)\),所以只需要证明\(sdom(w)\)支配\(w\)就可以证明此定理。对于\(r\)到\(w\)的任意一条路径\(p\),令\(x\)为路径\(p\)上最后一个满足\(x \lt sdom(w)\)的点。如果\(x\)不存在,那么\(sdom(w) = r\)支配\(w\),得证。否则令\(y\)为路径\(p\)上\(x\)之后的满足\(sdom(w) \dot \to y \dot \to w\)的最小的点。令\(q = (x = v_0, v_l, v_2, \dots , v_k = y)\)为路径\(p\)上\(x\)到\(y\)的部分。我们可以断言\(v_i \gt y, \forall 1 \le i \le k - 1\)。假设它不成立,即\(\exists v_i \lt y, 1 \le i \le k - 1\)。通过引理1可得存在\(v_j(i \le j \le k - 1)\)是\(y\)的真祖先。由\(x\)的定义可得\(v_j \ge sdom(w)\),所以\(sdom(w) \dot \to v_j \overset{+}{\to} y \dot \to w\),这与\(y\)的定义矛盾,所以此断言得证。
此断言使得路径\(q\)也是满足半支配点定义中的路径,并且由于\(x\)的定义,所以\(sdom(y) \le x \lt sdom(w)\)。因为所有满足\(sdom(w) \overset{+}{\to} u \dot \to w\)的\(u\)也满足\(sdom(u) \ge sdom(w)\),而\(sdom(w) \dot \to y \dot \to w\),所以\(y = sdom(w)\),由此可得\(r\)到\(w\)的任意一条路径都经过\(sdom(w)\),\(sdom(w)\)支配\(w\),此定理得证。
定理3. 对于任意点\(w\)(\(w \ne r\)),令\(u\)为所有满足\(sdom(w) \overset{+}{\to} u \dot \to w\)的\(u\)中\(sdom(u)\)最小的一个,且\(sdom(u) \le sdom(w)\) ,即\(sdom(u) \dot \to sdom(w) \overset{+}{\to} u \dot \to w\),那么\(idom(w) = idom(u)\)。
证明: 令\(z\)为满足\(sdom(w) \to z \dot \to w\)的点,有\(sdom(u) \le sdom(z) \le sdom(w)\)。
由引理5可得\(u \dot \to idom(w)\)或\(idom(w) \dot \to idom(u)成立\)。由引理4和命题条件可得\(idom(w) \dot \to sdom(w) \overset{+}{\to} u\),所以前者不成立,那么后者一定成立。为了证明\(idom(w) = idom(u)\),只需要证明\(idom(u)\)支配\(w\)。
对于\(r\)到\(w\)的任意一条路径\(p\),令\(x\)为路径\(p\)上最后一个满足\(x \lt idom(u)\)的点。如果\(x\)不存在,那么\(idom(u) = r\)支配\(w\),得证。否则令\(y\)为路径\(p\)上\(x\)之后的满足\(idom(u) \dot \to y \dot \to w\)的最小的点。令\(q = (x = v_0, v_l, v_2, \dots , v_k = y)\)为路径\(p\)上\(x\)到\(y\)的部分。类似定理2中这部分的证明,\(x\)和\(y\)的定义说明\(v_i \gt y(1 \le i \le k - 1)\),因此\(sdom(y) \le x\)。由于由引理4得到的\(idom(u) \dot \to sdom(u)\),有\(sdom(y) \le x \lt idom(u) \le sdom(u)\)。
由于\(u\)是树\(T\)上从\(z\)到\(w\)的路径上的点中半支配点最小的点,所以\(y\)一定不是\(sdom(w)\)的真后代。此外,\(y\)一定不是\(idom(u)\)的真后代和\(u\)的祖先,否则就存在一条由\(r \dot \to sdom(y)\),\(sdom(y) = v_0, v_1, \dots , v_k = y(v_i \lt y, \forall 1 \le i \le k - 1)\)和\(y \dot \to u\)组成的路径没有经过\(idom(u)\),这与\(idom\)的定义矛盾。
由于\(idom(u) \dot \to y \dot \to w\),所以只有可能\(y = idom(u)\)。由此可得\(r\)到\(w\)的任意一条路径都经过\(idom(u)\),\(idom(u)\)支配\(w\),此定理得证。
推论1. 对于任意点\(w\)(\(w \neq r\)),令点\(u\)为所有满足\(sdom(w) \overset{+}{\to} u \dot \to w\)的点\(u\)中\(sdom(u)\)最小的一个,有
\(idom(w) = \left \{ \begin{aligned} & sdom(w) & (sdom(u) = sdom(w)) & \\ & idom(u) & (sdom(u) \lt sdom(w)) & \end{aligned} \right. \tag{2}\)
证明: 通过定理2和定理3可以直接得到。
因为\(w\)也是\(u\)的候选,所有一定有\(sdom(u) \le sdom(w)\)
接下来的定理提供了一种计算半支配点的方法。
定理4. 对于任意点\(w\)(\(w \ne r\)),有\(sdom(w) = min(\{v | (v, w) \in E , v \lt w \} \cup \{sdom(u) | u \gt w , \exists (v, w) \in E , u \dot \to v\} ) \tag{3}\)
证明: 令\(x\)为\((3)\)右边的值。我们先证明\(sdom(w) \le x\)。假设第一种情况:\(x\)是满足\(\exists (x, w) \in E, x \lt w\)。由\((1)\)所以\(sdom(w) \le x\)。另一种情况:\(x = sdom(u)\),\(u\)是满足\(u \gt w \ and \ \exists (v, w) \in E \ and \ u \dot \to v\)的点。由\((1)\)存在一条路径\(x = v_0, v_1, \dots , v_j = u\)满足\(v_i \gt u \gt w, \forall 1 \le i \le j - 1\)。树\(T\)上的路径\(u = v_j \to v_{j + 1} \to \dots \to v_{k - 1} = v\)满足\(v_i \ge u \gt w, \forall j \le i \le k - 1\)。因此路径\(x = v_0, v_1, \dots , v_{k - 1} = v, v_k = w\)满足\(v_i \gt w, \forall 1 \le i \le k - 1\)。由\((1)\)所以\(sdom(w) \le x\)。
接下来证明\(sdom(w) \ge x\)。\(sdom(w) = v_0, v_1, \dots , v_k = w\)为一条满足\(v_i \gt w, \forall 1 \le i \le k - 1\)的路径。当\(k = 1\)时,\((sdom(w), w) \in E\),由引理3可得\(sdom(w) \lt w\)。因此\(sdom(w) \ge x\)。另一种情况当\(k \gt 1\)时,令\(j\)为最小的满足\(1 \le j \le k - 1 \ and \ v_j \dot \to v_{k - 1}\)。这样的\(j\)存在因为\(k - 1\)是\(j\)的候选。
我们断言\(v_i \gt v_j, \forall 1 \le i \le j - 1\)。假设它不成立,即\(\exists v_i \lt v_j(1 \le i \le j - 1)\)。选择满足\(v_i \lt v_j(1 \le i \le j - 1)\)并且\(v_i\)最小的\(i\)。由引理1(路径引理)可得\(v_i \overset{+}{\to} v_j\),与\(j\)的定义矛盾。此断言得证。
这个断言说明了\(sdom(w) \ge sdom(v_j) \ge x\)。因此当\(k \ge 1\)时\(sdom(w) \ge x\),所以\(x = sdom(w)\),此定理得证。
来源
Lengauer T, Tarjan R E. A fast algorithm for finding dominators in a flowgraph[M]. ACM, 1979.
Lengauer-Tarjan算法的相关证明的更多相关文章
- 有向图tarjan算法求连通分量的粗浅讲解、证明, // hdu1269
打算开始重新复习一遍相关算法.对于有向图tarjan算法,通过学习过很多说法,结合自己的理解,下面给出算法自己的观点. 算法总模型是一个dfs,结合一个stack(存放当前尚未形成SCC的点集合),记 ...
- tarjan算法求scc & 缩点
前置知识 图的遍历(dfs) 强连通&强连通分量 对于有向图G中的任意两个顶点u和v存在u->v的一条路径,同时也存在v->u的路径,我们则称这两个顶点强连通.以此类推,强连通分量 ...
- (转载)LCA问题的Tarjan算法
转载自:Click Here LCA问题(Lowest Common Ancestors,最近公共祖先问题),是指给定一棵有根树T,给出若干个查询LCA(u, v)(通常查询数量较大),每次求树T中两 ...
- 强连通分量的Tarjan算法
资料参考 Tarjan算法寻找有向图的强连通分量 基于强联通的tarjan算法详解 有向图强连通分量的Tarjan算法 处理SCC(强连通分量问题)的Tarjan算法 强连通分量的三种算法分析 Tar ...
- Tarjan算法详解理解集合
[功能] Tarjan算法的用途之一是,求一个有向图G=(V,E)里极大强连通分量.强连通分量是指有向图G里顶点间能互相到达的子图.而如果一个强连通分量已经没有被其它强通分量完全包含的话,那么这个强连 ...
- Tarjan算法求有向图的强连通分量
算法描述 tarjan算法思想:从一个点开始,进行深度优先遍历,同时记录到达该点的时间(dfn记录到达i点的时间),和该点能直接或间接到达的点中的最早的时间(low[i]记录这个值,其中low的初始值 ...
- tarjan算法 POJ3177-Redundant Paths
参考资料传送门 http://blog.csdn.net/lyy289065406/article/details/6762370 http://blog.csdn.net/lyy289065406/ ...
- 有向强连通分支Tarjan算法
本文转载自:http://blog.csdn.net/xinghongduo/article/details/6195337 说到以Tarjan命名的算法,我们经常提到的有3个,其中就包括本文所介绍的 ...
- tarjan算法大意
Tarjan算法 (以发现者Robert Tarjan命名)是一个在图中寻找强连通分量的算法.算法的基本思想为:任选一结点开始进行深度优先搜索dfs(若深度优先搜索结束后仍有未访问的结点,则再从中任选 ...
随机推荐
- Interface default method介绍
一.introduce interface default method Introduce default methodWrite the default method at interfaceTh ...
- Python基本语法_输入/输出语句详解
目录 目录 前言 输入 raw_input input raw_input 和 input 的区别 输出 print print 基本格式化输出 print复杂格式化输出 flags标志位 width ...
- flex布局使用方法简要汇总
近期因为使用inline-block,在项目部署后出现了一点小问题,几番解决未果,遂使用flex布局,于是借此机会对flex布局的用法做一个简要的汇总. 遇到的bug如下: 本想两个div使用inli ...
- java:LeakFilling(Hibernate)
1.关系型数据库: Oracle / Mysql 数据持久化的技术: IO JDBC XML ... 主流的持久层框架: Hibernate mybatis---->apache产品 JPA( ...
- React-Native中props用法详解
props就是属性,是为了描述一个组件的特征而存在的.它是父组件传递给子组件的. 使用props 通过上一个页面传递 新建一个 PropsTest.js 文件 1 2 3 4 5 exprot def ...
- 基于vant实现一个问卷调查
实现背景 最近学习<vue实战>,第二篇进阶篇有一个练习 刚好最近在研究vue移动端框架vant 两者结合,实现这么个小项目 实现代码 新建 vue单文件 L0529L.vue <t ...
- Akka系列(六):Actor解决了什么问题?
前言..... 文档来源于 : What problems does the actor model solve? Actor解决了什么问题? Akka使用Actor模型来克服传统面向对象编程模型的 ...
- IOMETER的简单使用
1. 网上下载文件: 一般至少包含两个: 2. 使用IOmeter 进行 功能测试. 注意选择 测试需要的盘 注意 选择的磁盘 会被充满. 会产生一个特别大的文件 3. 选择测试对象 4. 可以查看实 ...
- Linux单元测试题一
一. 试验操作题目: 开启Linux操作系统,要求以root用户登录,然后完成下面的操作: 1.查看目前哪些用户登陆到系统上 [root@baidu home]# w 12:41:44 up 45 m ...
- 微软宣布加入 OpenJDK,打不过就改变 Java 未来!
近日,微软的 Bruno Borges 在 OpenJDK 邮件列表中发布了一条消息,内容包含接下来发生的事情以及微软如何开始将其团队整合到 OpenJDK 社区. 在邮件中,Bruno Borges ...