P9534 [YsOI2023] 广度优先遍历

发布时间 2023-08-14 09:36:31作者: Hanghang007

好题。

首先考虑到对于任意的边的输入顺序,分层图是不会变的,即所有点到根的最短距离不变。

那么分为两种边,分别为不同层的边相连,相同层的边相连。

显然第二种边是无用的,我们将其放到最后输出即可。

由于下层的决策会影响上层的决策而且不同层之间的边的顺序不会影响答案,所以我们按分层图从大到小处理。

不妨设当前层为 $t$,那么上一层为 $t-1$,对于连接不同层的边,层数大的儿子,小的为父亲,节点 $x$ 的真父亲是 $ba_x$,$t-1$ 到 $t$ 的边的顺序只有两种因素决定:$t$ 层的点的相对顺序,以及 $t$ 层的点 $x$ 所有父亲的相对关系。

对于第一种情况,显然对于每个点都要被真父亲选走,所以 $ba_x$ 要在其他父亲之前。

对于第二种情况,一种暴力的做法是枚举 $t$ 层任意两点 $x,y$,如果 $x$ 要在 $y$ 之前,那么 $ba_x$ 也一定要在 $ba_y$之前。

由于答案一定存在,那么每一层的相对关系一定由多个 $DAG$ 组成,我们对每个点赋值 $p$,那么如果 $x$ 在 $y$ 之前,那么 $p_x$ 一定比 $p_y$ 小。

这里存在一个问题,有可能对于两个不同 $DAG$ 的点,$p$ 值也会存在一个相对关系,但在原图中这是没有的,所以我们要再建立并查集,维护每个 $DAG$ 里面的节点。