支配树
为了方便本文的叙述,做出如下可能不严谨的定义:
对于一棵树,我们可以用简洁的表示从到的路径上的所有点组成的集合,假如我们希望这个集合不包含或,只要将闭区间改为开区间即可。如表示从到的路径上的所有点(不包含)组成的集合。
我们从一道简单的板子题(在读完这篇文章以后就是了)开始:
给定一个个点,条边的有向图,以及一个出发点。询问次,每次给定点,,保证从出发可以到达。问从出发到达的所有路径是否都需要经过。
。
为了解决这个问题,我们定义有向图上的支配关系:对于一个固定的出发点,如果从出发到达的所有路径都需要经过,则称是的支配点,即支配。特别的,我们认为不是的支配点。
我们来研究一下支配关系有哪些性质:
首先,我们将以为根的树建立出来。容易发现,对于任意一个点,它的所有支配点只可能是它的祖先——显然,对于不是它的祖先的任意一个点,我们从通过树边到达就不需要经过。
接着我们假设是的支配点中深度最大的(即距离最近的),那么还可以发现:对于,是的支配点当且仅当是的支配点。
证明如下:
首先证明充分性。如果支配,支配,那么假设不支配,即存在一条路径不经过。那么显然由于这条路径必定经过,于是我们就找到了一条不经过到达的路径,这与前提条件矛盾,于是假设不成立,充分性得证。
再证明必要性。如果支配,不支配,显然可以找到一条路径不经过而到达。此时由于是深度最大的的支配点,因此沿着树边一直走到,必定不会经过,于是就不可能是的支配点。
于是我们就可以知道,对于任意一个点,我们只要找到它深度最大的支配点,其余的支配点就都是的支配点。不难发现,这样的支配关系形成了一个类似树的结构,将之前所说的当作的父亲的话,那么的所有支配点就是这棵树上它的祖先。我们将这棵树叫做支配树,将这样的记为。
那么问题来了,如何求出呢?
为了解决这个问题,我们先定义一个叫做半支配的东西:
对于任意一个点,从出发,只经过不是的祖先的点就可以到达(不包含,),则称是的半支配点,即半支配。
首先,我们可以发现的深度最小的半支配点一定是的祖先。因为假设的深度最小的半支配点不是的祖先,那么显然我们可以沿着树边往回走,一直走到某个的祖先上。这其间肯定不会经过除以外的的祖先点,于是的深度比小,且也是的半支配点,于是假设不成立,得证。
接着,如果是的深度最小的半支配点,那么树上路径中的点就显然不是的支配点——因为从出发存在一条路不经过它们而到达。我们将这样的记为。
我们来考虑如果求得了半支配点,那么如何求支配点。考虑对于一个点,树上路径中的点一定不是的支配点。并且对于任意一个的祖先,树上路径中的点也一定不是的支配点。反之,如果某个的祖先不被和任何一个包含,那么一定是的支配点——否则一定会存在一条不经过的路径到达,中一定存在两个的祖先使得树上路径经过而之间不经过其它的祖先,于是一定会被某个区间包含。
于是就是不被如上所述的这些区间包含的的祖先中深度最大的。考虑递归解决这个问题,如果是中的深度最小的,那么如果就是,显然不会被任何区间包含了,那么就是。否则我们就去掉区间并求对于来说这个问题的答案即可——而这就是,已经求好了。
好,现在解决最后一个问题,如何求出。分两种情况讨论:
最后一条边为前向边或树边。显然另一端就是的祖先,路径必须结束。这种情况可以直接得到半支配点。
最后一条边为横插边或后向边,设走到的点为,而,在树上的为。由于为,因此树上路径中的点一定无法到达中的点,于是对于的来说,不会有经过中的点的路径,那么显然树上路径中的点对于来说都是合法的。于是用树上路径中的点的来更新即可。可以发现沿着时间戳反向求的话,我们求的顺序就不会冲突。
于是我们就解决了文章开头提到的那个问题。至于具体的实现,我们在反向求的过程中可以用带权并查集维护一段树上路径的最小值,在求完一个点的以后将它的儿子与它合并即可。这样每次查询时并查集维护的恰好就是我们需要的那一条链。至于求的过程,我们需要知道的信息,于是将请求接入的链表中。每一次求完的后,我们扫描其父亲的请求链表,对于链表中每一个,可以发现带权并查集此时维护的就是我们要查询的区间,直接从带权并查集上得知最小的为哪一个并存下来并清空链表,在最后求时直接用即可。
时间复杂度。
有向图上还有类似的支配边的关系,容易发现只有树边能成为支配边。且如果一条边为的支配边,需要为的支配点,且对于所有有非树边指向的点,都有支配。
有向图上还有割点、桥、点双、边双的定义。不过还是下次填坑吧...
参考链接:[https://zhuanlan.zhihu.com/p/30432617][1]