点分治和树dp的关联还是有点大。。所以这锅还是窝的。。
点分治主要用于处理点对问题。。
点分治比较套路。。做几道题应该就没什么问题了?
基本思想就是选取一个点(为重心时复杂度最佳)为根,然后把问题分解成处理经过根的链和去掉根后的子树中的子问题。。
然后最关键的就是怎么求经过根的链了。。。
这里用的是dfs处理出深度然后将深度和小于k的记录下来,然后排序之后就可以直接用双指针计数了。。复杂度是O(n)
然而会发现同一子树上的点对实际上并不经过根。。所以要将同一子树的点对去掉。。
Tree
Time Limit: 1000MS | | Memory Limit: 30000K |
Total Submissions: 28286 | | Accepted: 9428 |
Description
Give a tree with n vertices,each edge has a length(positive integer less than 1001).
Define dist(u,v)=The min distance between node u and v.
Give an integer k,for every pair (u,v) of vertices is called valid if and only if dist(u,v) not exceed k.
Write a program that will count how many pairs which are valid for a given tree.
Input
The input contains several test cases. The first line of each test case contains two integers n, k. (n<=10000) The following n-1 lines each contains three integers u,v,l, which means there is an edge between node u and v of length l.
The last test case is followed by two zeros.
Output
For each test case output the answer on a single line.
Sample Input
5 4 1 2 3 1 3 1 1 4 2 3 5 1 0 0
Sample Output
8
Source
[Submit] [Go Back] [Status] [Discuss]