3743: [Coci2015]Kamp
Time Limit: 10 Sec
Memory Limit: 128 MB
Submit: 442
Solved: 210
[ Submit][ Status][ Discuss]
Description
一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的。
有K个人(分布在K个不同的点)要集中到一个点举行聚会。
聚会结束后需要一辆车从举行聚会的这点出发,把这K个人分别送回去。
请你回答,对于i=1~n,如果在第i个点举行聚会,司机最少需要多少时间把K个人都送回家。
Input
第一行两个数,n,K。
接下来n-1行,每行三个数,x,y,z表示x到y之间有一条需要花费z时间的边。
接下来K行,每行一个数,表示K个人的分布。
Output
输出n个数,第i行的数表示:如果在第i个点举行聚会,司机需要的最少时间。
Sample Input
7 2
1 2 4
1 3 1
2 5 1
2 4 2
4 7 3
4 6 2
3
7
Sample Output
11
15
10
13
16
15
10
HINT
【数据规模】
K <= N <= 500000
1 <= x,y <= N, 1 <= z <= 1000000
Source
[ Submit][ Status][ Discuss]
随意选择一个起点,以它为根,司机的载人过程可以这样考虑
每次选择一个有关键点的子树,往那里走,把所有在里面的人送到家以后再回来
这样最后会回到根,每条需要经过的边恰好经过两次
不过并没有规定最后要回来,所以选择一条最长的路径,这条路径上的边只经过一次就行了
用树形dp维护一下,然后维护链长的最大值和次大值,方便换根的时候转移
#include
#include
#include
#include
#include
#include
#include
#include
#include