牛牛题。
首先你把答案 reverse 一下,就是指定一个根,然后每次扩展一个相邻于当前连通块的点。
先考虑如何 check。
首先一个 native 的想法是考虑两种方向相反的 DFS 序。
然后你发现一个菊花图就把你 hack 了。
然后另一个 native 的想法是用两个根这样做。
但实际上你通过跑一下你发现还是会出问题,然后你看一下相同的两棵树,你发现他们一般动一两条边,然后他们分别连的都是同一连通块。
这启示我们从一个点连到哪个点进行考虑。
我们注意到我们根据一个拓扑序来构造一棵树的话,本质上你是把每个点选择一个前面的点挂上去。其实跟整个树的结构无关。你只关心每一步了连到了哪个点。
然后我们就想,如果对于两个拓扑序来讲一个点都能挂到前面的两个点上,那是不是就不唯一了呢?这个感觉是非常对的。
形式化的来讲,你对每个 $i$ 都找出 $i$ 在每个拓扑序中的位置,然后把前面的所有数的集合交起来。如果存在一个 $i$ 使得该集合大小超过 $1$ 则不合法。
然后你趁洗澡的时候对拍,然后回来发现拍了四万多组了都没出问题,就把他当对的了。
然后接下来的思路,你灵光一现,想到我们其实不怎么关心是怎么遍历的,我们关心的是从哪个点开始遍历的。
然后我们就想一条边他是怎么被经过的。然后你发现除了连接叶子的边其他边都要被正反经过一遍。
我们把叶子剥了,把每个里叶子都作为起点扫一遍就能做到。(这个显然是下界)
然后我们发现这个图的性质很优雅。我们发现这样一并把原来的性质满足了。
但我们还要考虑叶子怎么放置。我们发现我们直接紧贴着放在里叶子的后面即可。因为你发现这样一定不会重。
然后就做完了。
啊?
等等,然后怎么做答案呢。
直接做即可。
我好厉害。
你发现你输出解会有点问题。
但不慌,你扰动一下,你每次把 $G$ 翻转一下。
然后就过了!!!