【SPOJ QTREE2】QTREE2 - Query on a tree II(LCA)
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)的更多相关文章
- 【SPOJ - GSS2】Can you answer these queries II(线段树)
区间连续不重复子段最大值,要维护历史的最大值和当前的最大值,打两个lazy,离线 #include<cstdio> #include<cstring> #include< ...
- 【HANA系列】SAP 【第一篇】EXCEL连接SAP HANA的方法(ODBC)
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP [第一篇]EXCEL连接 ...
- 【学习笔记】深入理解js原型和闭包(0)——目录
文章转载:https://www.cnblogs.com/wangfupeng1988/p/4001284.html 说明: 本篇文章一共16篇章,外加两篇后补的和一篇自己后来添加的学习笔记,一共19 ...
- 【HANA系列】SAP 【第二篇】EXCEL连接SAP HANA的方法(ODBC)
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP [第二篇]EXCEL连接 ...
- 【持久化框架】Mybatis与Hibernate的详细对比(转发)
前言 这篇博文我们重点分析一下Mybatis与Hibernate的区别,当然在前面的博文中我们已经深入的研究了Mybatis和Hibernate的原理. Mybatis [持久化框架]Mybatis简 ...
- 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 ...
- 【Python实战】模块和包导入详解(import)
1.模块(module) 1.1 模块定义 通常模块为一个.py文件,其他可作为module的文件类型还有".pyo".".pyc".".pyd&qu ...
- 【转帖】HBase读写的几种方式(二)spark篇
HBase读写的几种方式(二)spark篇 https://www.cnblogs.com/swordfall/p/10517177.html 分类: HBase undefined 1. HBase ...
- 【Amaple教程】3. 模板指令与状态数据(state)
一个模块的template模板.JavaScript和css之间的关系其实可以如下图表示: 如果你了解Angular.Vue动态模板,那你将会对Amaple的模板感到很熟悉,在Amaple中,temp ...
随机推荐
- noip2013 积木大赛
题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...
- JavaScript中清空数组的三种方式
方式1,splice ? 1 2 3 var ary = [1,2,3,4]; ary.splice(0,ary.length); console.log(ary); // 输出 [],空数组,即被清 ...
- QT QT练习一
界面中通过三个 QLineEdit控件,一个QPushButton实现+ - * /四则运算,点击pushbutton后将运算结果显示在QLabel控件上. #ifndef WIDGET_H #def ...
- JS添加DOM元素CSS权重BUG
修改删除table的时候,比如拆分合并单元格,合并全部TR中的某个TD后在拆分还原,即使直接在td标签中设置了td的高宽属性,当td在css文件中设置为宽度auto的时候,不能显示出TD来,显示TD宽 ...
- 283 Move Zeroes
/** * 题意:将0挪到末尾,并且不改数组中原有元素的顺序 * 解析:找到0元素,然后寻找其后面非0的元素,进行交换位置 * @param {number[]} nums * @return {vo ...
- 移除首页->重回首页
之前发布了一篇文章<订餐系统之获取淘宝外卖订单>,因为是关于淘宝外卖的,所以文中出现这个词时,都加了链接,还设置了 target='_blank',就是为了让看的人方便点击,查看.后来,博 ...
- libsvm使用详细说明
一,简介 LibSVM是台湾林智仁(Chih-Jen Lin)教授2001年开发的一套支持向量机的库,这套库运算速度还是挺快的,因此成为目前国内应用最多的SVM的库.详细的使用说明及博主博客见下链接: ...
- go println与printf区别
Println 与Printf 都是fmt 包中的公共方法 Println :可以打印出字符串,和变量: Printf : 只可以打印出格式化的字符串,可以输出字符串类型的变量,不可以输出整形变量和整 ...
- rar 命令
1 wger http://www.rarlab.com/rar/rarlinux-3.9.2.tar.gz 下载文件包 会下载在当前目录 2 cp xxx.xxx ../ 复制xxx.xxx到上个目 ...
- Hibernate 的dialect 大全
RDBMS 方言 DB2 org.hibernate.dialect.DB2Dialect DB2 AS/400 org.hibernate.dialect.DB2400Dialect DB2 OS3 ...