分析
我们不难有一个贪心的想法:枚举每个数,将它们分别移动到尽可能小的节点上面去。
考虑把一个数字送到另一个数字上,对于一个点我们一共有三种限制:
* 对于起始点,选中的边必须先于其他所有边删掉;
* 对于中转点,选中的两条边必须顺序删掉;
* 对于结束点,选中的边必须在最后删掉。
那么这样一来我们将删的边的顺序排成一排,可以发现我们可以用双向链表来维护。于是我们给每个节点 u uu 都建立一个双向链表。
但在计算答案的过程中,一定有一些是连不到一起的,这种情况我们直接把它们看成一堆链表就可以了。
于是就可以用两次 DFS 解决这个问题:
枚举每个数字,第一次 DFS 找出它能够到达的最小的节点,第二次 DFS 更新链表。
总时间复杂度 O(N2)\bold O(\bold N^\bold2)O(N2)
各种情况的讨论还是看代码吧。。。太复杂了 我不想写 写不出来。。。
AC代码
简直是分类大讨论啊。。。