[省选联考 2025] 图排列 —— 故地重游

[省选联考 2025] 图排列 —— 故地重游

Sub 1 \(G\) 是树,\(n\le 2000\)

注意本质上就是安排结点的排列顺序,不要让边交叉,递归地做这种事情,在每个点处,相当于我们能够安排子树的顺序。

我们只需要记录每个子树序列的第一个数就可以比较了,不需要把序列都记下来。

Sub 2 \(G\) 联通,\(n\le 2000\)

这是赛时跳过的分,现在看看,应该是破解的关键。注意对于一个环来说,你必须把他顺序放置,要不然就会交叉。

好像还是同样的。就不断地断环为链,然后剖分出最大的环,然后递归,就是说把边双剖出去。

总结一下,边双缩点,外面的按树做,然后里面的边双,找最小点,放最左边,断掉一条边,重复边双缩点的操作。

等一下,大环套小环是不可能的,或者说,只有一种环套环是有可能的——他只能是一条链上面加若干不交可包含的边的那种。

我猜这种应该是可以随便转的。

所以显然,第一位一定是 1,我们先把 1 放到第一位,然后其实这种环套环的多余边没什么用,也没有造成限制。

具体怎么做,以 1 为根建立 DFS 树,如果有到 1 的返祖边 \(x\to 1\)(要是有多个,随便抓一个),把他抓出来,然后遍历 1 到 x,把中间其他点的 DFS 子树拿去递归,一个DFS 的子树就可以随便决定放左边还是右边的顺序,大于根的都放右边,小于根的都放左边,然后内部再排下序。注意一个在有返祖边时的特判,根的子树是可以任意排序的,但是非根的、1-x 路径上的子树只能选择放左还是放右。要是没有返祖边,就直接递归根的子树,可以随便排序。

Sub 3 \(n\le 2000\)

可以直接尝试插进当前序列,插进第一个比本树序列的第一个大的那个,注意最开始总是以最小的那个为根,递归的时候不需要,因为结构固定了。

Sub 4 \(n\le 10^5\)

我们只需解决最后插入的那个问题即可。其实我们知道每个树序列的第一个,就是最小的那个标号。我们用链表并存每个点对应的当前位置,支持下区间加区间求最小值即可,插入可以用链表维护。

不对不对,什么东西,直接按顺序进行,把联通块按最小标号排序,如果下一个数大于下一块的最小标号,那么就继续加入下一块的内容。

等等,这个玩意要对,必须依赖于,我要找到一个点双里面的一个哈密尔顿路,这样我这个就是满足的,引用题解的话说,剩下的边就是挂在哈密顿路上面的。

我感觉这玩意跟题解殊途同归了,我必须找到点双内部的哈密顿环。而这是 CF1656I Neighbour Ordering - 洛谷

俺的任务完成辣!

posted @ 2025-05-21 20:10  haozexu  阅读(18)  评论(0)    收藏  举报