You are given a tree (an undirected acyclic connected graph) with N nodes, and edges numbered 1, 2, 3...N-1. Each edge has an integer value assigned to it, representing its length.

We will ask you to perfrom some instructions of the following form:

  • DIST a b : ask for the distance between node a and node b
    or
  • KTH a b k : ask for the k-th node on the path from node a to node b

Example:
N = 6 
1 2 1 // edge connects node 1 and node 2 has cost 1 
2 4 1 
2 5 2 
1 3 1 
3 6 2

Path from node 4 to node 6 is 4 -> 2 -> 1 -> 3 -> 6 
DIST 4 6 : answer is 5 (1 + 1 + 1 + 2 = 5) 
KTH 4 6 4 : answer is 3 (the 4-th node on the path from node 4 to node 6 is 3)

Input

The first line of input contains an integer t, the number of test cases (t <= 25). t test cases follow.

For each test case:

  • In the first line there is an integer N (N <= 10000)
  • In the next N-1 lines, the i-th line describes the i-th edge: a line with three integers a b c denotes an edge between a, b of cost c (c <= 100000)
  • The next lines contain instructions "DIST a b" or "KTH a b k"
  • The end of each test case is signified by the string "DONE".

There is one blank line between successive tests.

Output

For each "DIST" or "KTH" operation, write one integer representing its result.

Print one blank line after each test.

Example

Input:
1 6
1 2 1
2 4 1
2 5 2
1 3 1
3 6 2
DIST 4 6
KTH 4 6 4
DONE Output:
5
3

先以一点为根做dfs,计算每个点的深度、父亲、离根的距离,倍增法找出LCA,两点的距离就能算出来了。

路径上的第K个值则先判断LCA到起点的深度差是否大于k,是则在起点到LCA的路径上,否则在LCA到终点的路径上。

#include <iostream>
#include <cstdio>
#include <cstring>
#define N 10005
using namespace std;
struct edge{
int to,next,w;
}e[N<<];
int head[N],cnt;
void add(int u,int v,int w){
e[++cnt]=(edge){v,head[u],w};
head[u]=cnt;
}
int n;
int deep[N],dis[N],p[N][];
void dfs(int x,int fa){
deep[x]=deep[fa]+;
p[x][]=fa;
for(int i=;p[x][i];i++)
p[x][i+]=p[p[x][i]][i];//由x的2^i祖先和祖先的2^i祖先算出x的2^(i+1)祖先
for(int i=head[x];i;i=e[i].next){
int to=e[i].to;
if(to==fa)continue;
dis[to]=dis[x]+e[i].w;
dfs(to,x);
}
}
int lca(int a,int b){
if(deep[a]<deep[b])swap(a,b);
for(int j=;j>=;j--)
if(deep[a]-(<<j)>=deep[b])//将a上移到和b深度一样
a=p[a][j];
if(a==b)return a;
for(int j=;j>=;j--)
if(p[a][j]&&p[a][j]!=p[b][j]){//a、b一起上移
a=p[a][j];
b=p[b][j];
}
return p[a][];
}
int get(int u,int d){//u上升到d深度
for(int j=;j>=;j--)
if(deep[u]-(<<j)>=d)
u=p[u][j];
return u;
}
int main() {
int t;
cin>>t;
while(t--){
memset(head,,sizeof head);
memset(p,,sizeof p);//这个要清空!!
cnt=;
cin>>n;
for(int i=;i<n;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
//deep[0]=0;dis[1]=0;这可以不写
dfs(,);
char op[];
while(){
scanf("%s",op);
if(op[]=='O')break;
if(op[]=='I'){
int u,v;
scanf("%d%d",&u,&v);
printf("%d\n",dis[u]+dis[v]-*dis[lca(u,v)]);
}else{
int u,v,k;
scanf("%d%d%d",&u,&v,&k);
int fa=lca(u,v),d;
if(deep[u]-deep[fa]<k){
d=deep[fa]+k-(deep[u]-deep[fa]+);
u=v;
}
else d=deep[u]-k+;//需要的深度
printf("%d\n",get(u,d));
}
}
}
}
  

【SPOJ QTREE2】QTREE2 - Query on a tree II(LCA)的更多相关文章

  1. 【SPOJ - GSS2】Can you answer these queries II(线段树)

    区间连续不重复子段最大值,要维护历史的最大值和当前的最大值,打两个lazy,离线 #include<cstdio> #include<cstring> #include< ...

  2. 【HANA系列】SAP 【第一篇】EXCEL连接SAP HANA的方法(ODBC)

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP [第一篇]EXCEL连接 ...

  3. 【学习笔记】深入理解js原型和闭包(0)——目录

    文章转载:https://www.cnblogs.com/wangfupeng1988/p/4001284.html 说明: 本篇文章一共16篇章,外加两篇后补的和一篇自己后来添加的学习笔记,一共19 ...

  4. 【HANA系列】SAP 【第二篇】EXCEL连接SAP HANA的方法(ODBC)

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP [第二篇]EXCEL连接 ...

  5. 【持久化框架】Mybatis与Hibernate的详细对比(转发)

    前言 这篇博文我们重点分析一下Mybatis与Hibernate的区别,当然在前面的博文中我们已经深入的研究了Mybatis和Hibernate的原理. Mybatis [持久化框架]Mybatis简 ...

  6. spoj 913 Query on a tree II (倍增lca)

    Query on a tree II You are given a tree (an undirected acyclic connected graph) with N nodes, and ed ...

  7. 【Python实战】模块和包导入详解(import)

    1.模块(module) 1.1 模块定义 通常模块为一个.py文件,其他可作为module的文件类型还有".pyo".".pyc".".pyd&qu ...

  8. 【转帖】HBase读写的几种方式(二)spark篇

    HBase读写的几种方式(二)spark篇 https://www.cnblogs.com/swordfall/p/10517177.html 分类: HBase undefined 1. HBase ...

  9. 【Amaple教程】3. 模板指令与状态数据(state)

    一个模块的template模板.JavaScript和css之间的关系其实可以如下图表示: 如果你了解Angular.Vue动态模板,那你将会对Amaple的模板感到很熟悉,在Amaple中,temp ...

随机推荐

  1. [No000008]发工资不仅仅是让你写代码的

    这是我对团队每个新进员工说的第一件事情.这句话的意思是,我并不关心你是如何快速完成任务的,哪怕代码很差,只要它像救生艇通气门一样管用就行.这句话也是我最喜欢的座右铭之一. 这个说法其实很合理:我们的工 ...

  2. NSIS来自己设定快捷方式的图标

    CreateShortCut 快捷文件.lnk 目标文件 参数 图标文件 图标索引号 启动选项 键盘快捷键 描述 CreateShortCut "$DESKTOP\快捷方式.lnk" ...

  3. selmodel

    selmodel不仅可以设置checkbox,还可以设置单元格选中模式,列选择模式,行选择模式

  4. Windows 8.1 新增控件之 AppBar

    Windows 8.1 与Windows 8 相比已经有了很多改进,从ITPro 角度这篇文章<What's New in Windows 8.1>已经表述的很详细.对开发者来说,最明显的 ...

  5. 代码整洁--使用CodeMaid自动程序排版

    在项目开发的过程中,如果只是验证命名规则.而没有统一程序排版,项目中很容易就会出现类似下列范例的程序代码产出.这样的产出,虽然能够正常地提供项目功能.并且符合微软的命名规则,但是因为程序排版凌乱的问题 ...

  6. R统计分析处理

    [翻译]Awesome R资源大全中文版来了,全球最火的R工具包一网打尽,超过300+工具,还在等什么? 阅读目录 0.前言 1.集成开发环境 2.语法 3.数据操作 4.图形显示 5.HTML部件 ...

  7. U-boot与linux的关系

    基本上没有啥关系,U-boot的话你也知道,说白了就像是Dos工具箱,本身算是个精简的Linux系统了,主要是负责硬件的初始化和引导,本身带有一些工具,作为引导程序,常作为嵌入式设备的引导.当真正的系 ...

  8. 代码重构之 —— 一堆if、esle 逻辑的处理

    这几天,接手一个同事的代码,关于微信接口开发的,那一堆的 if,看得哥蛋痛了,这个毛病也是很多新手容易犯的,所以特地把这次重构写出来. 下面来我们看看这个代码的问题所在,if else 里面的代码块逻 ...

  9. SublimeText3下的Python开发环境配置

    最近重装了机器,需要重新安装Python的开发环境,中间遇到了几个问题,特些记录一下,以防下次备忘. 从Python的网站下载安装Python,这个非常简单,没有什么值得说的,大家可以参考廖雪峰的这个 ...

  10. [BZOJ1116][Poi2008]LCO(并查集)

    题目:http://hzwer.com/3010.html 分析:注意这里无向边是对入度没有贡献的. 那么对于一个n个点的连通块而言,如果它是一颗树(n-1条边),那么把所有边全部从某个根开始向下指, ...