HDU 5286 How far away ? lca
题目链接:
题目
How far away ?
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
问题描述
There are n houses in the village and some bidirectional roads connecting them. Every day peole always like to ask like this "How far is it if I want to go from house A to house B"? Usually it hard to answer. But luckily int this village the answer is always unique, since the roads are built in the way that there is a unique simple path("simple" means you can't visit a place twice) between every two houses. Yout task is to answer all these curious people.
输入
First line is a single integer T(T<=10), indicating the number of test cases.
For each test case,in the first line there are two numbers n(2<=n<=40000) and m (1<=m<=200),the number of houses and the number of queries. The following n-1 lines each consisting three numbers i,j,k, separated bu a single space, meaning that there is a road connecting house i and house j,with length k(0<k<=40000).The houses are labeled from 1 to n.
Next m lines each has distinct integers i and j, you areato answer the distance between house i and house j.
输出
For each test case,output m lines. Each line represents the answer of the query. Output a bland line after each test case.
样例
input
2
3 2
1 2 10
3 1 15
1 2
2 3
2 2
1 2 100
1 2
2 1
output
10
25
100
100
题意
给你一颗树,问两点间距离
题解
离线求每个点的深度,则距离为dep[u]+dep[v]-2*dep[lca(u,v)];
代码
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#define mp make_pair
#define X first
#define Y second
using namespace std;
const int maxn = 4e4+10;
const int maxm = 18;
int n, m;
vector<pair<int, int> > G[maxn];
int dep[maxn],dep2[maxn],anc[maxn][maxm];
void dfs(int u,int fa,int d,int d2) {
dep[u] = d, dep2[u] = d2;
anc[u][0] = fa;
for (int j = 1; j < maxm; j++) {
int f = anc[u][j - 1];
anc[u][j] = anc[f][j - 1];
}
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i].X, w = G[u][i].Y;
if (v == fa) continue;
dfs(v, u, d + 1, d2 + w);
}
}
int Lca(int u, int v) {
if (dep[u] < dep[v]) swap(u, v);
for (int i = maxm - 1; i >= 0; i--) {
if (dep[anc[u][i]] >= dep[v]) {
u = anc[u][i];
}
}
if (u == v) return u;
for (int i = maxm - 1; i >= 0; i--) {
if (anc[u][i] != anc[v][i]) {
u = anc[u][i], v = anc[v][i];
}
}
return anc[u][0];
}
void init() {
for (int i = 0; i <= n; i++) G[i].clear();
memset(anc, 0, sizeof(anc));
}
int main() {
int tc;
scanf("%d", &tc);
while (tc--) {
scanf("%d%d", &n, &m);
init();
for (int i = 0; i < n - 1; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
G[u].push_back(mp(v, w));
G[v].push_back(mp(u, w));
}
dfs(1, 0,0,0);
while (m--) {
int u, v;
scanf("%d%d", &u, &v);
int lca = Lca(u, v);
printf("%d\n", dep2[u] + dep2[v] - 2 * dep2[lca]);
}
}
return 0;
}
HDU 5286 How far away ? lca的更多相关文章
- hdu 5286 How far away ? tarjan/lca
How far away ? Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...
- HDU 2586 How far away ? (LCA)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 LCA模版题. RMQ+LCA: #include <iostream> #incl ...
- HDU 2586 How far away ? (LCA,Tarjan, spfa)
题意:给定N个节点一棵树,现在要求询问任意两点之间的简单路径的距离,其实也就是最短路径距离. 析:用LCA问题的Tarjan算法,利用并查集的优越性,产生把所有的点都储存下来,然后把所有的询问也储存下 ...
- HDU - 2586 How far away ?(LCA模板题)
HDU - 2586 How far away ? Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & ...
- hdu 2586 How far away ?倍增LCA
hdu 2586 How far away ?倍增LCA 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2586 思路: 针对询问次数多的时候,采取倍增 ...
- HDU 2586 How far away ?【LCA】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=2586 How far away ? Time Limit: 2000/1000 MS (Java/Oth ...
- HDU 2586 How far away ?(LCA在线算法实现)
http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:给出一棵树,求出树上任意两点之间的距离. 思路: 这道题可以利用LCA来做,记录好每个点距离根结点的 ...
- hdu 2586 How far away ? 带权lca
How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) P ...
- HDU 2586.How far away ?-离线LCA(Tarjan)
2586.How far away ? 这个题以前写过在线LCA(ST)的,HDU2586.How far away ?-在线LCA(ST) 现在贴一个离线Tarjan版的 代码: //A-HDU25 ...
随机推荐
- linux 命令 sort
Linux下的sort排序命令详解(一) 1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出. [zook ...
- laravel artisan 命令列表
5.4版本新增 命令 说明 备注 php artisan make:resource ? 创建api返回格式化资源 >=5.4版本可用 php artisan make:rule ? 创建val ...
- 嵌入式C语言自我修养 13:C语言习题测试
13.1 总结 前面12节的课程,主要针对 Linux 内核中 GNU C 扩展的一些常用 C 语言语法进行了分析.GNU C 的这些扩展语法,主要用来完善 C 语言标准和编译优化.而通过 C 标准的 ...
- STM32F4寄存器编写跑马灯例程
最近由于在学习STM32看到别人用寄存器编程控制跑马灯,于是自己也想试一试.可是试了好久终究弄不出来.回头看了下库函数的调用关系才搞明白.首先通过查看GPIOA的设置函数发现设置如下: void GP ...
- 读耗子叔的《从Equifax信息泄露看数据安全》
本文永久地址:https://www.cnblogs.com/erbiao/p/9214219.html 最近正好看到耗子叔<从Equifax信息泄露看数据安全>这篇文章,就来说一下这篇文 ...
- STM32F103C8T6、STM32F103ZET6工程模板
STM32F103C8T6工程模板,推荐使用以下最新版本 最终版 2018 7 16 https://pan.baidu.com/s/1lIdZ2awus_quVu332RvJ6Q https:// ...
- SQLSERVER字符串处理函数
sqlserver提供了一系列字符串处理函数:substring.left.right.len.charindex.patindex.replace.replicate.stuff.upper.low ...
- java一些封装好的常用算法
1.简单排序Collections.sort(): //简单排序 List<String> staff= new LinkedList<>(); staff.add(" ...
- 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--J-强迫症的序列
链接:https://www.nowcoder.com/acm/contest/90/J 来源:牛客网 1.题目描述 牛客网是IT求职神器,提供海量C++.JAVA.前端等职业笔试题库,在线进行百度阿 ...
- 初识Symbol
Symbol作用域 Symbol,是ES6语法中新增的,值是由Symbol函数调用产生的. var s1 = Symbol(); console.log(s1); // Symbol console. ...