Problem
n个村庄,构成一棵树,边权均为1。起点为1,要遍历所有节点,并且还要回到1。易得,花费恒等于2*(n - 1)。现在可以修k条路,使得花费最少。(k要么是1要么是2,这是突破口)
Solution
我们加一条(u,v),就相当于连同u->v的路径一起构成了简单环。那么我们就可以用这个1来代替一次环的返回。贪心的想,这个路径是树的直径时自然是最妙的。于是k=1就解决了。
那如果k=2, 我们分两种情况。当然万变不离其宗,贪心总是对的。如果次大路径与之前的直径没有交点,那就最好了,与k=2相同。但是呢如果有交边,那么交边你必须要再遍历一下。相当于还抵消掉了一部分最大环。我们计算后发现,把先前的直径每一条边都变成-1,再求直径,就解决了。
代码在以前树的直径博客有。看了一下大家代码....就我这么写的?