鉴于原论文对半支配点的定义有点抽象,本文在不引入半支配点的概念下介绍支配树及所求算法。
定义1.1:在一张有向图中,给定起点s,若删除点x后,s无法到达y(x≠y),则称x为y的支配点,也称x支配y、y被x支配。特别的,s是除自身外所有点的支配点。
观察1.1:若x支配y,y支配z,则x支配z。
观察1.2:支配关系不会出现环。
观察1.3:若z同时被x,y支配,则x,y间存在支配关系。
证明:
若假设y不支配x且x不支配y,但z同时被x,y支配
对于任意一条到z的路径,由对称性不妨设路径先经过x再经过y,那么我们得到一条从y出发不经过x到达z的路径,由假设知存在一条由s出发不经过x到达y的路径,将两条路径合并得到一条从s出发不经过x到达z的路径,则x不支配z,与假设矛盾。
定义1.2:根据观察1.2与观察1.3,除s外的每个点x,必定存在支配点(s支配所有点),且支配点集里存在某个点y被集合中的其他所有点支配,若我们将该点为x的父亲,则可以建议一棵以s为根的有根树,我们将这棵树称为支配树。
考虑如何求DAG的支配树。
观察2.1:x在支配树上的父亲,为所有在DAG中能直接到达x(即{y|∃(y,x)∈E})的点在支配树上的LCA。
证明:
若|{y|∃(y,x)∈E}|=1,则显然x父亲为y;
若|{y|∃(y,x)∈E}|>1,则支配x的点也必然支配所有的y。
故我们可以求该图的拓扑序,然后按拓扑序逐步建支配树。
下面观察一般有向图的一些性质。
观察3.1:对于任意dfs树,x的支配点一定为x的祖先。
定义3.1:对于某棵dfs树,[x,y]表示x到y最短路径的点集,(x,y)表示x到y最短路径不包括x,y的点集。
定义3.2:对于x的祖先y,若存在从y出发不经过(y,x)到达x的路径,则称y满足条件,令所有满足条件的y中深度最小的为sdom(x)。
除s外任意点均存在sdom(x),因为在dfs树上的父亲一定满足条件。
观察3.2:(sdom(x),x)中任意点不是x的支配点。
证明:
我们可以构造出从s出发不经过(sdom(x),x)中任意点到达x的路径:s沿树边到达sdom(x),由定义可知存在从sdom(x)出发不经过(\text{sdom(x)},x)而到达x的路径,将两条路径接上即可。
观察3.3:对于x的某个祖先z,不被(sdom(x),x)包含,且不被任意x的祖先y的(sdom(y),y)包含,是z为x支配点的充要条件。
证明:
假设z被某个包含了,则必定不为支配点。
否则,假设z未被任何包含,且不为x的支配点,一定存在从s到x不经过z的路径s=v0,v1,⋯,vm=x,这条路径中一定存在vk1,vk2(k1<k2)为x的祖先,满足∀i∈(k1,k2),vi均不为x的祖先且vk1,vk2在dfs树中的路径包含z,则sdom(vk2)一定为vk1或其祖先,则(sdom(vk2),vk2)包含z,与z未被包含矛盾。
若我们得到了所有的{sdom(i)},那么求支配树父亲将非常简单,下面介绍如何求{sdom(i)}
先探究{sdom(i)}的性质
假设sdom(x)到x不经过(sdom(x),x)的路径中的最后一条边为(y,x),那么有两种情况。
1):y为x的祖先。
2):最后一条边为横插边或后向边。
对于1),则此时sdom(x)=y;
对于2),不妨设此路径为sdom(x)=v0,v1,⋯,vm−1=y,vm=x,设路径中第一个位于(LCA(x,y),y]中的点vk,一定有sdom(vk)=sdom(x),而此路径中其他位于(LCA(x,y),y]中的点sdom的深度一定大于等于sdom(vk)的深度。
证明:
若sdom(vk)≠sdom(x),由于存在以上路径,sdom(vk)的深度一定小于sdom(x),此时sdom(vk)也为x的祖先,由于存在sdom(vk)到vk不经过(sdom(vk),vk)的路径,此路径必定不经过(sdom(x),x),该路径再依次接vk+1,⋯,vm即可得到从sdom(vk)到x不经过(sdom(vk),x),与sdom(x)定义矛盾,故sdom(vk)=sdom(x)。
若对于此路径中其他位于(LCA(x,y),y]中的点l,若sdom(l)深度小于sdom(vk),即sdom(x),我们仍然可以构造出从sdom(l)到达x不经过(sdom(l),x)的路径,与sdom(x)定义矛盾。
由以上,我们得到求sdom(i)的算法
枚举(y,x)
1):y为x的祖先,用y更新sdom(x)
2):y不为x的祖先,设z为LCA(x,y),用(z,y]中点的sdom更新sdom(x)
易知2)中dfn(y)>dfn(x),对dfn倒序更新sdom。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
2020-07-25 North America Championship 2020