题目链接
题目类型:模拟
题目来源:BestCoder #17
题目分析
题目大意
给出一棵树,每条边的长度为$1$,那么我们很容易得到$n*(n-1)/2$条路径的长度,将这些长度排序,给出$k$,问前$k$小的路径的长度之和为多少
解析
这题构思的非常巧妙。
题目要找前$k$小的路径长度,那么我们直接构造前$k$小的长度即可。我们可以建立这样一个队列,队列中每次存一条路径的始点、第二个点、长度,第二个点的意思是这样的:从始点到终点的路径上紧邻着始点的点,我们可以通过第二个点约束始点扩散的方向。对于每一条路径,我们可以形成两条有向边。所以,我们想找前$k$小的边,只需要找前$2k$小的边,然后把他们的长度除以二即可,每一条边都可以由比他长度小$1$的边构造形成。我们只需要将长度为$0$的边,也就是点push进队列,然后每次去找他们的延伸路径,再加入队列,直到加够数量即可。
代码
1 |
|