题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586

题意:给出一棵树还有两个点然后求这两个点的最短距离。

题解:val[a]+val[b]-2*val[root]就是这两个点到根节点的距离再减去它们最近的公共父节点到根节点的距离的两倍

然后就是利用lca来求最近公共父节点。由于是模版题代码上写了一点注释方便理解。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
const int M = 4e4 + 10;
vector<pair<int , int>>vc[M];
int p[M][20] , deep[M] , val[M];//p[i][j]表示距离i点2的j次的父节点是什么。deep表示深度
void dfs(int pos , int pre , int dep) {
int len = vc[pos].size();
deep[pos] = dep;
p[pos][0] = pre;
for(int i = 0 ; i < len ; i++) {
int u = vc[pos][i].first;
if(u != pre) {
val[u] += (val[pos] + vc[pos][i].second);
dfs(u , pos , dep + 1);
}
}
}//dfs一遍记录一下每一个点的深度顺便记录一下当前点到父节点的距离
void init(int n) {
for(int i = 0 ; i < 16 ; i++) {
for(int j = 1 ; j <= n ; j++) {
if(p[j][i] == -1) {
p[j][i + 1] = -1;//如果是根节点之后距离不论为多少都为-1
}
else {
p[j][i + 1] = p[p[j][i]][i];//跟新p
}
}
}
}//初始化p
int lca(int a , int b) {
if(deep[a] < deep[b]) {
swap(a , b);
}
int d = deep[a] - deep[b];
for(int i = 0 ; i < 16 ; i++) {
if(d & (1 << i)) {
a = p[a][i];
}//这里很巧妙好好理解一下
}//使得a,b两点在同一深度
if(a == b) {
return a;
}
for(int i = 16; i >= 0 ; i--) {
if(p[a][i] != p[b][i] && p[a][i] != -1) {
a = p[a][i];
b = p[b][i];
}//如果不是共同根那么继续向上遍历。
}
return p[a][0];
}
int main() {
int t , n , m , u , v , w;
scanf("%d" , &t);
while(t--) {
scanf("%d%d" , &n , &m);
for(int i = 1 ; i <= n ; i++) {
vc[i].clear();
val[i] = 0;
}
memset(p , -1 , sizeof(p));
for(int i = 1 ; i < n ; i++) {
scanf("%d%d%d" , &u , &v , &w);
vc[u].push_back(make_pair(v , w));
vc[v].push_back(make_pair(u , w));
}
dfs(1 , -1 , 1);
init(n);
for(int i = 0 ; i < m ; i++) {
scanf("%d%d" , &u , &v);
int pos = lca(u , v);
printf("%d\n" , val[u] + val[v] - 2 * val[pos]);
}
}
return 0;
}

hdu2586 How far away ?(lca模版题)的更多相关文章

  1. poj 1986 Distance Queries 带权lca 模版题

    Distance Queries   Description Farmer John's cows refused to run in his marathon since he chose a pa ...

  2. HDU 2222 Keywords Search(AC自动机模版题)

    Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others ...

  3. PAT (Top Level) Practise 1008 Airline Routes(Tarjan模版题)

    1008. Airline Routes (35) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue Given a ...

  4. POJ 2533 Longest Ordered Subsequence(LIS模版题)

    Longest Ordered Subsequence Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 47465   Acc ...

  5. HDU 1712 ACboy needs your help (分组背包模版题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1712 有n门课,和m天时间.每门课上不同的天数有不同的价值,但是上过这门课后不能再上了,求m天里的最大 ...

  6. 【POJ3159】Candies 裸的pqspfa模版题

    不多说了.就是裸的模版题. 贴代码: <span style="font-family:KaiTi_GB2312;font-size:18px;">#include & ...

  7. poj 2299 Ultra-QuickSort 逆序对模版题

    用树状数组求逆序数 唯一的坑点就是sum要用long long存 直接贴代码了 以后忘了还能直接看 2333…… PS:和hdu3743代码是一样的,因为两个都是逆序对模版题…… #include&l ...

  8. E - Just a Hook HDU - 1698 线段树区间修改区间和模版题

    题意  给出一段初始化全为1的区间  后面可以一段一段更改成 1 或 2 或3 问最后整段区间的和是多少 思路:标准线段树区间和模版题 #include<cstdio> #include& ...

  9. hdu 1286 找新朋友 欧拉函数模版题

    找新朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Des ...

随机推荐

  1. netty使用EmbeddedChannel对channel的出入站进行单元测试

    一种特殊的Channel实现----EmbeddedChannel,它是Netty专门为改进针对ChannelHandler的单元测试而提供的. 名称 职责 writeInbound 将入站消息写到E ...

  2. UE4中UMG与C++交互 页面文本修改

    在UE4中,有两种方式创建ui,一种是使用slate的方式,一种是UMG,UMG是slate的封装,是一个可视化的ui编辑器.slate则是纯c++方式(之前实验过一次slate创建页面,代码相当麻烦 ...

  3. 如何在MySQL中输入中文

    解决MySQL中的Incorrect string value MySQL中输入中文:在MySQL建标的时候,直接往表中的varchar(255)中输入中文的话是会报错的,大概是因为数据库的默认编码是 ...

  4. Oracle SQL常用内置系统函数总结

    Oracle数据库  内置系统函数主要分为以下类别:数学函数.字符串函数.日期函数.转换函数.聚合函数.分析聚合函数 一.数学函数 ------------返回数字       abs(n):返回数字 ...

  5. 压力测试-jmeter

    1. 场景描述 新申请的服务器,要压测下python算法程序最多能执行多少条数据,有几年没用压力测试工具-jmeter了,重新下载了最新版本,记录下,也希望能帮到准备使用jmeter做压测的朋友. 2 ...

  6. golang学习(1)---快速hello world

    很多著名的计算机语言都是一两个人在业余时间捣鼓出来的,但是Go语言是由Google的团队打造的.可能一些基础的知识点我不会细讲,因为这个时代你真的得快速学习,才能适应发展. 来看看go的hello, ...

  7. Nunit与Xunit介绍

    Nunit安装 首先说下,nunit2.X与3.X版本需要安装不同的vs扩展. nunit2.x安装 安装如上3个,辅助创建nunit测试项目与在vs中运行单元测试用例 . 1.Nunit2 Test ...

  8. (三十)c#Winform自定义控件-文本框(三)

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  9. (十九)c#Winform自定义控件-停靠窗体

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  10. 「雕爷学编程」Arduino动手做(10)——敲击传感器模块

    37款传感器和模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器与模块,依照实践出真知(动手试试)的理念,以学习和交流为目的,这里准备 ...