Tree and Hamilton Path
给你一棵树N个顶点,N-1条带权边
还有有一张 N个点的完全图,图上两点之间的边的边权为它们在树上的距离。
求最长哈密顿路径(即不重不漏恰好经过每个点一次)。
Format
Input
第一行给出数字N
接下来N-1行描述这个树,树的边权小于等于1e9
n≤1e5
Output
One integer, the sum of x and y.
Samples
输入数据 1
5
1 2 5
3 4 7
2 3 3
2 5 2
输出数据 1
38
依据八中友好教室2的思路,我们知道如果希望边被经过的次数最多,要选重心点。
而这个题同样的发现,只要选择重心点,其将整个树分成上下结点数相等的两部分。
如上图,2上方面有1,5这两个点,下方有3,4这两个点。
于是在走边的时候,保证相邻的两个点来自上下部,
例如
1...4...5....3....2....1
这样的回路,或者
5...4...1....3....2...5
这样的回路
则走过的总权值就是一个固定值,即为
对于(u,v)这样的一条边,设以v为根的子树有size[v]个结点,则这条边走过的次数为2*Min(size[v],n-size[v])
证明如下:不妨设size[v]小于n-size[v]
则对于以v为子树内的结点,从它外面的点走到它时(u,v)这条边要走一次,从它再走出去,又要走一次。
于是上述成立。
以上图为例
[3,4]之间的边要走过2次
[2,3]之间的边要走过4次
于是当走成一条回路的时候,结果是个固定值为2*(5+2+7)+4*3=28+12=40
现在只需要每个点走一次,也就是说整个回路的最后一条边要被减去。
则当这条边为某条与重心直接相连的边,且边权最小时,结果最优。
当然如果图有两个重心的时候,减去的边权为两个重心之间的边权。。
一句话题解就是:
当N为奇数,则当上半部N/2个点,与下半部N/2个点相匹配,每次匹配都要过重心点
当N为偶数,则当上半部(N-2)/2个点,与下半部(N-2)/2个点相匹配,每次匹配都要过重心边
(匹配方式为:从一个重心点开始,以另一个重心点为最终的结束点)
例如下图
最终结果为总代价减去3-4之间的边长
这个应该很好想吧,因为重心点都在靠中间的位置,如果走成
1...5...2...6...3...4....1
减去[1..4]之间的边长,那就亏大了。