支配树学习笔记

本文详细介绍了支配树的概念,包括支配点、最近支配点、半支配点,并通过引理和定理深入解析它们之间的关系。利用Lengauer-Tarjan算法求解支配树,同时给出了算法流程和关键步骤。最后,提供了算法实现所需的变量维护和数据结构。
摘要由CSDN通过智能技术生成

参考了两篇博客,感觉各有优劣,略加缝合写了个我自己的理解版本,两篇博客的地址见下
两位大佬的博客都用了严格的符号化,因为我不大会latex所以就没有用,而是用了中文叙述,不准确求轻喷

定义一个单源有向图,如果存在x,y满足:
去掉x,起点就无法到达y,则称x支配y,x是y的支配点

显然起点和自己都是每个点的支配点,一个点会有很多个支配点,而且至少有一个(起点的自己也是起点)

定理1
x有唯一的最近支配点

显然一个点x的两个不同支配点y,z必然也存在着支配关系,要不然这两个点都将不是x点的支配点(割掉y可以走z,反之亦然)

于是x有唯一的最近支配点(immediate dominator),这个最近的理解大致就是支配x且被所有支配x的其他点支配,x的最近支配点记作idom(x)

如果存在唯一最近支配点,那就相当于有着唯一的父亲,这个结构是树形的,也称作支配树

求解支配树的做法一般是lengauer-tarjan,时间复杂度O(nlogn+m),空间复杂度O(n+m)

为了更好理解算法,先来一点引理

首先根据DFS序建树,按照我的习惯将x的dfs序记作dfn(x),既然带着tarjan,那么肯定还是树边、非树边(前向,后向,横叉)这些

然后简单复习一下基本概念,树边就是dfs树上的边,前向边就是指向祖先的边,后向边就是指向子孙的边,横叉边就是无血缘关系的边

显然树边dfs序小指向大,前向边dfs序大指向小,后向边dfs序小指向大,横叉边dfs序大指向小(可以自行理解一下横叉边,如果从小到大就违背了dfs深度优先的规则)

接着来一些简单引理

引理1
如果x,y满足dfn(x)<=dfn(y)则x到y的所有路径必然经过x和y的公共祖先

x是y的祖先很好理解,因为x就是x和y的公共祖先,如果是属于两个不同的子树,那么不是公共祖先的y的祖先anc(y)同样dfn(anc(y))>dfn(x)以及x的子树,所以无法通过任何一种边只走子树跳到y,所以如果x到y有路径,路径必然经过x,y的公共祖先

然后定义一下半支配点(semi-dominator),x的半支配点记作sdom(x)

如果一个点y满足dfn[y]最小且可以通过一条经过点vi均满足dfn(vi)>=dfn(x)的路径(y不需要满足)到达x就称y为x的半支配点

引理2
如果x不是起点,那么idom(x)必然是x的祖先

如果不是这样的话,可以从起点(根)直接走树边到达x,那就违背了支配点的定义,所以idom(x)必然是x的祖先

引理3
如果x不是起点,那么sdom(x)必然是x的祖先

首先我们知道fa(x)一定是sdom(x)的一个候选,因为他满足到x的路径上经过的其他点(其实经过了0个点)满足半支配点的定义,所以sdom(x)<=dfn(fa(x))

如果sdom(x)属于另一个子树,因为sdom(x)<dfn(x),所以根据引理1,这条路径必然经过sdom(x)和x的公共祖先,这个公共祖先的dfn肯定比x小,那么就违背了sdom(x)到x的路径上经过的所有点dfn都大于x的定义,所以sdom(x)必然是x的祖先

引理4
如果x不是起点,那么idom(x)必然是sdom(x)的祖先(可以相等)

如果不是的话就可以从起点走sdom(x)绕到x,那么又不是idom(x)的定义了

引理5
如果v是u的祖先(可以相等),那么要么v是idom(u)的祖先(可以相等),要么idom(u)是idom(v)的祖先(可以相等)

也就是说这两条从idom(x)到x的路径完全不交或者包含

如果不这样,那么这条路径idom(v)->idom(u)->v->u
要么idom(u)就是v的支配点,矛盾

如果不这样,说明idom(v)有一条边可以绕过idom(u)到v,那同样也能绕过idom(u)到u,那么idom(m)的定义就无了,同样不行

接着是若干个新的定理

定理2
如果sdom(v)是u的祖先,u是v的祖先(可以相等),并且对于所有u满足sdom(u)>=sdom(v),那么idom(v)=sdom(v)

由定理4,只用证明sdom(v)支配v,假设从起点到v的路径上有x满足x最大且dfn(x)<sdom(v),y是这条路径上离sdom(v)最近的一个子孙,那么x->vi->y这条路径还是满足所有dfn(vi)>y,要不然,根据定理1,vi和y之间的路径就要经过y的祖先anc(y),那么就不满足y是sdom(v)最近的子孙,矛盾,所以一定还是满足dfn(vi)>y

这样一来,x就是sdom(y)的一个候选,肯定dfn(x)>=sdom(y)
又因为对于所有u(也就是y)满足sdom(y)>sdom(v)

所以dfn(x)>sdom(v),所以不存在这样的x,所以y一定是sdom(v),也就是sdom(v)支配v,根据定理4,idom(v)=sdom(v)

于是定理2证毕

定理3
如果sdom(v)是u的祖先,u是v的祖先,且u’是所有u中sdom(u)最小的,如果sdom(v)>sdom(u’),则idom(v)=idom(u’)

按这样说就是sdom(u’)是sdom(v)的祖先,sdom(v)是u’的祖先(可以相等),u’是v的祖先

有引理5可以知道要么idom(v)是idom(u’)的祖先,要么u’是idom(v)的祖先,因为sdom(v)>=idom(v)(引理4),所以u’不可能是idom(v)的祖先,于是idom(v)是idom(u’)的祖先,现在只需要证明idom(u’)支配v

这个证明同样取起点到v的路径上的一个x,使得x<idom(u’),然后必然在idom(u’)到v的树边路径上有一个点y是路径上的点,要不然dfn(v)<dfn(路径上除x的所有点)成立,x就会变成sdom(v)

我们取dfn最小的y,根据刚才定理2那一圈证明,我们可以证明x是sdom(y)的一个候选,x>=sdom(y),由引理4可以知道sdom(y)<=x<=idom(u’)<=sdom(u’),因为u’是sdom(v)到v之间sdom最小的,而sdom(y)比sdom(u’)还小,所以y必然不在sdom(v)到v之间,也就是说y不是sdom(v)的完全后代,于是idom(u’)是y的祖先(可相等),y是sdom(v)的祖先(可相等),那么再根据sdom(v)是u’的祖先(可相等)可以推出y是u’的祖先

显然y不可能是u’的祖先,不然可以通过起点到sdom(y)到y再到u’来绕开idom(u’),那就违背了idom(u’)的定义,也就是说y只能是idom(u’),不能是他的某个完全后代,也就是说idom(u’)支配v

于是定理3证毕

推论1
对于sdom(v)到v之间的所有点中sdom最小的u:
idom(v)=sdom(v) (sdom(u)=sdom(v))
idom(v)=idom(u) (sdom(u)<sdom(v))

这显然是定理2、3缝合的结果
现在我们需要一个高效的办法求解sdom(x)

定理4
s d o m ( v ) = m i n ( { u ∣ ( u , v ) ∈ E , d f n ( u ) < d f n ( v ) } ∪ { s d o m ( u ′ ) ∣ ( u , v ) ∈ E , d f n ( u ) > d f n ( v ) , u ′ 是 u 的 祖 先 ( 可 相 等 ) } ) sdom(v)=min(\{u|(u,v)\in E,dfn(u)<dfn(v)\} \cup\{sdom(u')|(u,v)\in E,dfn(u)>dfn(v),u'是u的祖先(可相等)\}) sdom(v)=min({ u(u,v)E,dfn(u)<dfn(v)}{ sdom(u

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值