Description
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 last test case is followed by two zeros.
Output
Sample Input
5 4 1 2 3 1 3 1 1 4 2 3 5 1 0 0
Sample Output
8
Source
题目大意:给定一棵有权的树,定义两点之间的距离为路径的边权和。给定一个安全值,求距离小于安全值的点对数目。
//================================================================================================
树的点分治。
考虑经过根的路径和没有经过根的路径。后者明显可以递归处理而且做法同前者。
那么经过根的合法点对的路径怎么求呢?
先O(N)深搜处理出每个点到根的距离,然后排序。这样可以做到O(N)的复杂度找出距离和小于安全值的对数。但是这里面包括从一个儿子里面伸上来的两条不合法的路径。额。。。再深搜每个儿子同理去掉不合法的部分。。
总感觉看上去各种暴力啊有木有。。。可是找到了树的重心了以后每次分治都能保证去掉一半的点,然后重复的次数就是log级别的,处理又是log的,所以跑出来的结果相当优秀啊、、
树只要一开始建一遍就好了。到后面分治的时候相当于切出若干个子树直接用就行了、
每次分治后都要调整根到当前子树的重心。
感觉这次敲的代码还是很可读的~~~算敲的比较清楚的一次了~~~
program pku_1741;
var line,g,next:array[1..20000] of longint;
//============================================================================
procedure prepare;
begin tot:=0;
end;
//============================================================================
procedure ins(x,y,z:longint);
begin
end;
//============================================================================
procedure qsort(l,r:longint);
var k,i,j,tt:longint;
begin
end;
//============================================================================
procedure init;
var i,x,y,z:longint;
begin
end;
//============================================================================
procedure build;
var u,v,i,top:longint;
begin
end;
//============================================================================
procedure adjust(var root:longint);
var max,heavy,i,v:longint;
begin
end;
//============================================================================
function find(root,ori:longint):longint;
var l,r,u,v,i,len:longint;
begin
end;
//============================================================================
procedure tree(root:longint);
var i,v:longint;
begin
end;
//============================================================================
begin
end.