在学习支配树之前,请保证已经会写lca(tarian求法)
简介
支配树是什么?支配树能干什么?
- 对于一个DAGDAG上的每个点ww,都存在点dd满足去掉dd之后起点无法到达ww,我们称作dd支配ww,dd是ww的一个支配点。TT中节点uu是uu子树中所有节点的支配点(必经点),
- 支配ww的点可以有多个,但是至少会有一个。显然,对于起点以外的点,它们都有两个平凡的支配点,一个是自己,一个是起点。
- 在支配ww的点中,如果一个支配点i≠wi≠wi≠wi≠w满足ii被ww剩下的所有非平凡支配点支配,则这个ii称作ww的最近支配点(immediatedominator)(immediatedominator),记作idom(w)idom(w)。
如果我们把图的起点称作ss,那么除ss以外每个点均存在唯一的idomidom。于是,连上所有rr以外的idom(w)→widom(w)→widom(w)→widom(w)→w的边,就能得到一棵树,其中每个点支配它子树中的所有点,它就是支配树。
下面我们来考虑一个问题:给定一个起点ss和一个终点tt,询问删掉哪些点能够使ss无法到达tt。
不难发现,支配点与割点并不相同,我们可以用某位大佬的图证明这一观点
显然在这种情况中即使我们割掉割点依然能使ss走到tt点。所以我们没有办法使用割点来解决这个问题。
那么我们如何处理这个问题呢???
如果该DAGDAG是一棵树,那没什么好说的,显然有fa[u]==idom[u]fa[u]==idom[u],那么路径s−>vs−>v上的点都应该是支配点,直接O(n)O(n)解决了
如果不是树该肿么办?我们考虑用拓扑序建立支配树:
由于我们是根据拓扑序来进行处理的那么当我们处理到第ii个节点uu时,第11~i+1i+1个节点显然已经处理完了,对于所有能够直接到达点uu的节点,我们求出它们在支配树上的lcalca vv,这个点vv就是点uu在支配树上的父亲。
如果使用倍增求lcalca,那么O((n+m)log2n)O((n+m)log2n)的时间内实现。