标签 - dp

NTT dp 多项式求逆    2017-02-22 17:34:38    163    1    3
分治 dp 斜率优化 凸包    2017-02-20 20:35:45    203    1    2
仙人掌 倍增 dp    2017-01-29 19:08:00    468    1    1
树木仙学习记录T^T
构造 dp 贪心    2016-09-30 21:10:13    640    0    0

Description

Serpent(水蛇)生活的地方有N个水坑,编号为0,...,N - 1,有M条双向小路连接这些水坑。每两个水坑之间至多有一条路径(路径包含一条或多条小路)相互连接,有些水坑之间根本无法互通(即M ≤ N-1 )。Serpent走过每条小路需要一个固定的天数,不同的小路需要的天数可能不同。Serpent的朋友袋鼠希望新修 N - M - 1条小路,让Serpent可以在任何两个水坑间游走。袋鼠可以在任意两个水坑之间修路,Serpent通过每条新路的时间都是L天。袋鼠希望找到一种修路方式使得修路之后Serpent在每两个水坑之间游走的最长时间最短。

举例说明

上图中有12个水坑8条小路( N = 12, M = 8)。假如L = 2 ,即Serpent通过任何一条新路都需要2天。那么,袋鼠可以修建3条新路: 
水坑1和水坑2之间;
水坑1和水坑6之间;
水坑4和水坑10之间。

上图显示了修路后的最终状态。从水坑0走到水坑11的时间最长,需要18天。这是 最佳结果,无论袋鼠如何选择修路方式,总会存在一些水坑对,Serpent需要18天 或者更长时间从其中一个走到另一个。
 

 

Input

N : 水坑的数目。
M : 原本存在的小路的数目。
L : Serpent通过新修的路经的时间。
A, B 和 T: 三个包含M个元素的数组,分别表示每条小路的两个端点和通过这条小路的时间。例如,第i条小路连接水坑 A[i-1]和水坑B[i-1],通过这条小路的时间是T[i-1]天。
 
 

Output


如上所述,表示游走于两个距离最远的水坑之间所需的时间。

Sample Input

12 8 2
0 8 4
8 2 2
2 7 4
5 11 3
5 1 7
1 3 1
1 9 5
10 6 3

Sample Output

18

HINT

 

 n <= 500000

 

Solution

贪心地构造解....

先求出每棵树i中与其他点的距离最大值最小的点的最大距离dis[i],然后把所有树接向dis最大的树...

至于求dis,我们可以维护节点u到子树的距离的最大值dp[u][0]和次大值dp[u][1].

若u是fa[u]的最大距离所在的子树,则dp[u][0] = max(dp[fa[u]][1] + w[fa->u], dp[v] + w[u->v])

否则dp[u][0] = max(dp[fa[u]][0