Description
给你一棵n个点的带边权无向树。
需要从1号点开始,将整棵树遍历一遍并最终回到1号点。
走到一个点时,可以在这个点设置一个传送门,只要地图上有两个传送门,就可以在它们之间以0的时间传送
如果要在当前节点设置传送门,并且已经有了两个传送门,那么需要选择之前的某一个传送门让他消失,也就是说任意时刻至多有两个传送门,且不能在同一节点。
求最小总时间。
n<=1000000
Solution
不妨以1为根。
首先我们可以肯定的是,最优走法一定是在祖先设置好了传送门,在某个后代遍历完了以后传回来。
如果没有传送门,时间显然是边权*2
有结论:如果当前节点有传送门,从它的某个子树中传了回来,再次走入这个子树一定不会更优。
换句话说,一个传送门的某个子树只有遍历完了才会传回来。
证明:
考虑我们为什么要重新走进去,那一定是我们传送回来的地方和我们还没遍历的地方在某个后代分叉了。
那么我们大可以直接将当前传送门设在分叉的位置,再暴力走回来,这样分叉到当前传送点路径都是两遍,而分叉以下的部分都是1遍。
这样我们就可以DP了
设为遍历完i为根的子树,不用传送门的时间(就是边权*2)
为可以用传送门的最优时间
考虑怎么转移F
假设我们当前节点为i,DP完的儿子是p
要么在当前节点设传送门,暴力走p,再传回来,很明显我们会从最深的那个叶子传回来。
要么在p的子树中设传送门,暴力走这条边2次(下去1次,回来1次)
因此
deepest[i]表示i子树中到i最远的叶子。
最后答案就是F[1]
Code