Dominator Tree--支配树

#在学习支配树之前,请保证已经会写lca(tarian求法)
#简介
支配树是什么?支配树能干什么?

  • 对于一个 D A G DAG DAG上的每个点 w w w,都存在点 d d d满足去掉 d d d之后起点无法到达 w w w,我们称作$ d 支 配 支配 w , , d 是 是 w 的 一 个 支 配 点 。 的一个支配点。 T 中 节 点 中节点 u 是 是 u$子树中所有节点的支配点(必经点),
  • 支配 w w w的点可以有多个,但是至少会有一个。显然,对于起点以外的点,它们都有两个平凡的支配点,一个是自己,一个是起点。
  • 在支配 w w w的点中,如果一个支配点 i ≠ w i ≠ w i≠wi≠w i̸=wi̸=w满足 i i i w w w剩下的所有非平凡支配点支配,则这个 i i i称作 w w w的最近支配点 ( i m m e d i a t e d o m i n a t o r ) (immediate dominator) (immediatedominator),记作 i d o m ( w ) idom(w) idom(w)

如果我们把图的起点称作 s s s,那么除 s s s以外每个点均存在唯一的 i d o m idom idom。于是,连上所有 r r r以外的 i d o m ( w ) → w i d o m ( w ) → w idom(w)→widom(w)→w idom(w)widom(w)w的边,就能得到一棵树,其中每个点支配它子树中的所有点,它就是支配树。

下面我们来考虑一个问题:给定一个起点 s s s和一个终点 t t t,询问删掉哪些点能够使 s s s无法到达 t t t

不难发现,支配点与割点并不相同,我们可以用某位大佬的图证明这一观点
Dominator Tree--支配树_第1张图片
显然在这种情况中即使我们割掉割点依然能使 s s s走到 t t t点。所以我们没有办法使用割点来解决这个问题。
那么我们如何处理这个问题呢???

如果该 D A G DAG DAG是一棵树,那没什么好说的,显然有 f a [ u ] = = i d o m [ u ] fa[u]==idom[u] fa[u]==idom[u],那么路径 s − > v s->v s>v上的点都应该是支配点,直接 O ( n ) O(n) On解决了

如果不是树该肿么办?我们考虑用拓扑序建立支配树:
**由于我们是根据拓扑序来进行处理的那么当我们处理到第 i i i个节点 u u u时,第 1 1 1~ i + 1 i+1 i+1个节点显然已经处理完了,对于所有能够直接到达点 u u u的节点,我们求出它们在支配树上的 l c a lca lca v v v,这个点 v v v就是点 u u u在支配树上的父亲。 **
如果使用倍增求 l c a lca lca,那么 O ( ( n + m ) l o g 2 n ) O((n+m)log2n) O((n+m)log2n)的时间内实现。

你可能感兴趣的:(#,支配树)