小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上。有一天,他们想爬到一个节点上去搞基,但是作为两只虫子,他们不想花费太多精力。已知从某个节点爬到其父亲节点要花费 c 的能量(从父亲节点爬到此节点也相同),他们想找出一条花费精力最短的路,以使得搞基的时候精力旺盛,他们找到你要你设计一个程序来找到这条路,要求你告诉他们最少需要花费多少精力
输入描述 Input Description
第一行一个n,接下来n-1行每一行有三个整数u,v, c 。表示节点 u 爬到节点 v 需要花费 c 的精力。
第n+1行有一个整数m表示有m次询问。接下来m行每一行有两个整数 u ,v 表示两只虫子所在的节点
输出描述 Output Description
一共有m行,每一行一个整数,表示对于该次询问所得出的最短距离。
样例输入 Sample Input
|
|
样例输出 Sample Output
|
|
数据范围及提示 Data Size & Hint
|
|
这是一道lca(最近公共祖先)的裸题, 我们只需要求出两点到根节点的距离和, 再用 距离和 减去 两次 lca到根节点的距离,即为两点间的最短路径长度;
那么lca要怎么求呢? 我们一起来看一看! 首先我们需要定义一个数组depth[i]记录i点的深度(通过函数dfs求出);一个二维数组father[x][i]记录点x向上2的i次方的祖先(通过函数pow_init求出);已知x,y求lca的方法:看x,y两点是否为同一深度,我们移动较深的点直至两点位于同一深度,然后从2的i次方开始跳(i为 上跳2的i次方 最大不超过根节点 时i的值),i递减,如果跳到同一点,则不跳(防止跳过lca到了别的点),最后我们肯定会走到离lca深度为1的点,再跳一个深度即可!
|
|