题目链接: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. 控制台出现_ob_:Obsever

    我遇到一个问题:我的代码想让他点击之后得到经纬度坐标数组,然后我就这样写了 然而控制台却读取出了

  2. 自定义itemCheckView

    极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...

  3. ABP 配置全局数据过滤器

    ABP官方数据过滤的地址:https://aspnetboilerplate.com/Pages/Documents/Data-Filters 中文可以看这个:https://aspnetboiler ...

  4. [GO语言的并发之道] Goroutine调度原理&Channel详解

    并发(并行),一直以来都是一个编程语言里的核心主题之一,也是被开发者关注最多的话题:Go语言作为一个出道以来就自带 『高并发』光环的富二代编程语言,它的并发(并行)编程肯定是值得开发者去探究的,而Go ...

  5. MYSQL 入门配置

    1.下载 MYSQL官网 2.目录结构图基本如下 3.运行CMD(管理员权限),进入MYSQL目录下面的bin目录 4.执行 mysqld install 5.执行 net start mysql 6 ...

  6. 【Python3爬虫】学习分布式爬虫第一步--Redis分布式爬虫初体验

    一.写在前面 之前写的爬虫都是单机爬虫,还没有尝试过分布式爬虫,这次就是一个分布式爬虫的初体验.所谓分布式爬虫,就是要用多台电脑同时爬取数据,相比于单机爬虫,分布式爬虫的爬取速度更快,也能更好地应对I ...

  7. Kendo-Grid for Vue API and Template

    写此博客的原因:在做项目时前端用的vue,后端用的jfinal.在前端veu中调用了kendo grid插件,但是在官方文档中对kendo grid for vue 的api和template都不太详 ...

  8. 新手学习selenium路线图(老司机亲手绘制)

    前言: 最近群里有不少小白,想入手selenium,但是一直没找到学习路线,还没入门就迷路了,于是小编亲手绘制了一幅学习路线图.希望能帮助小白快速入门,帮助已经入门的,尽快提升! 学习selenium ...

  9. python 编码报错问题 'ascii' codec can't encode characters 解决方法

    python在安装时,默认的编码是ascii, 当程序中出现非ascii编码时,python的处理常常会报这样的错 'ascii' codec can't encode characters pyth ...

  10. iOS 11 变化

    首先我是开发者,更关心对技术的影响,我又需要关注.学习哪些技术,猫神的文章:http://www.cocoachina.com/ios/20170607/19457.html 介绍了 ******** ...