Preface
给定一个有向图和一个起点,我们需要知道起点到某个点的关于必经点的信息。
若起点到点v的所有路径均经过点u,则我们称点u支配点v,显然一个点支配自己本身
顾名思义,支配树就是由某些支配关系构成的树。
定义
约定一些记号
,表示一条从u到v的有向边
,表示在DFS树上的父亲。
为从开始DFS整个图,号点的时间戳。
,表示DFS树上到的路径上的点集
表示路径上点集中除去点剩余的集合
我们定义一个点的最近支配点,它支配,且它也被除u以外的所有支配u的点支配
性质
显然唯一存在,且若我们重新建一个图,所有的与连一条边,那么这个新图是一棵以为根的树,也就是说不会成环(可以用反证法简单证明)。
这棵树就是我们说的支配树。
一定是在树上的祖先。(一样可以反证法简单证明)
问题就是要求出。
求解
为了求出,我们引入半必经点的概念。
半必经点
回归tarjan求强连通分量的算法,我们来观察DFS过程中会出现哪些边。
- 树边,DFS树上的父亲——儿子边。
- 后向边,祖先向后代连的非树边的边。
- 返祖边,DFS序大的后代向DFS序小的祖先连的边
- 横叉边,DFS序大的点向DFS序小的点连的边,且没有祖先后代关系。
容易证明不存在上面四种边以外的边。
记表示从开始,沿着边反着走,能够中途不经过u的祖先,最后到达的深度最浅(最小)的的祖先。
形式化的,是的祖先,且存在原图中的一条路径,
可以发现这两种定义是等价的,因为不可能通过反向边走到DFS序更小的且不是祖先的点去。
我们考虑它可能怎么走,要么通过树边/后向边的反向边直接走到一个祖先,要么通过返祖边/横叉边的反向边走到某些更大的点,然后在上找一个,满足,所有的的最浅的那个就用来更新。
可以发现最浅的一定是的祖先,因此我们不必担心不合法的问题。
那么我们就得到了的求法,按照DFS序倒序枚举所有点,按照上面的做法来不断更新,查询祖先可以用带权并查集来做,求出一个点的之后将它的所有树边儿子与它合并即可。
问题在于求
我们考虑,找到最浅的一个。
有定理:若,则,否则
这个定理请自行理解…我也不会证
有了这个定理之后我们可以将挂在上,扫到的时候就找到相应的,若就直接,否则因为此时还没有求出来,我们可以先将指向,最后全部都做完以后按照DFS序正序扫一遍将这部分的改成即可。
时间复杂度(因为不能按秩合并)
Code
洛谷P5180,支配树模板题。