51nod 2621 树上距离 (倍增+ LCA 模板)

有一棵n个节点的无向树,每条边有一个边权,现在有q次询问,每次询问给出两个点,求这两个点之间的简单路径上的边权和是多少。

输入格式
第1行:两个整数n和q,n表示这棵树的节点个数,q表示查询的次数。(1<=n,q<=100000) 第2行~第n行:每行有三个整数u,v,w,表示u与v之间有一条权值为w的边。(1<=w<=100000) 第n+1行~n+q行:每行有两个正整数x,y,表示要查询的两个点的编号。
输出格式
第1行-第q行:每行输出一个数,表示那要查询的两点之间的简单路径上的边权和。
输入样例
4 2
2 1 2
4 3 2
1 4 3
1 2
3 2
输出样例
2
7
样例解释

如图所示的数据中:

1号节点和2号节点之间的距离为:2

2号节点和3号节点之间的距离为:2+2+3=7

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<cstring>
#define ll long long
using namespace std;const int N = 1e5 +10;
int n, q;
int f[N][30], dep[N];
ll dis[N];struct Edge{int to, cost;
};
vector<Edge> g[N];void dfs(int u, int fa){f[u][0] = fa;  // for (int i = 1; i <= 20; i++)f[u][i] = f[f[u][i-1]][i-1];for(int i = 0; i < g[u].size(); i++){Edge e = g[u][i];if(e.to != fa){dis[e.to] = dis[u] + e.cost;dep[e.to] = dep[u] + 1;dfs(e.to, u);}}
}void init(){int u, v, w;for(int i = 1; i <= n - 1; i++){cin >> u >> v >> w;g[u].push_back(Edge{v, w});g[v].push_back(Edge{u, w});}dis[1] = 0;dep[1] = 0;dfs(1, 0);
}int lca (int u , int v){if(dep[u] < dep[v]) swap(u, v);int k = dep[u] - dep[v];for(int i = 20; i >= 0 ; i--){if((k >> i) & 1)u = f[u][i];}if(u == v) return u;for(int i = 20; i >= 0; i--){if(f[u][i] != f[v][i]){u = f[u][i];v = f[v][i];}}return f[u][0];
}
int main(){cin >> n >> q;init();int u, v;while(q--){cin >> u >> v;cout << dis[u] + dis[v] - 2 * dis[lca(u, v)] << endl;}
}

51nod 2621 树上距离 (倍增+ LCA 模板)相关推荐

  1. 洛谷 P4281 [AHOI2008]紧急集合 / 聚会(树上倍增 LCA)

    [AHOI2008]紧急集合 / 聚会 题目描述 欢乐岛上有个非常好玩的游戏,叫做"紧急集合".在岛上分散有 n n n 个等待点,有 n − 1 n-1 n−1 条道路连接着它们 ...

  2. P1967,ssl2267-货车运输【树上倍增LCA,最小生成树变形kruskal】

    正题 题目链接: https://www.luogu.org/problemnew/show/P1967 大意 一个无向图,每个边有个权值,若干个询问,求两个点之间的一条最短路是这条最短路上的最小权值 ...

  3. cogs 1588. [USACO Feb04]距离咨询 倍增LCA

    1588. [USACO Feb04]距离咨询 ★★   输入文件:dquery.in   输出文件:dquery.out   简单对比 时间限制:1 s   内存限制:256 MB [题目描述] 农 ...

  4. 01分数规划c语言,POJ 1330(LCA/倍增法模板)

    链接:http://poj.org/problem?id=1330 题意:q次询问求两个点u,v的LCA 思路:LCA模板题,首先找一下树的根,然后dfs预处理求LCA(u,v) AC代码: #inc ...

  5. BZOJ 2144 跳跳棋(神仙建模题,倍增 LCA,二分)【BZOJ修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2144 是 hydro 的 BZOJ ...

  6. bzoj1787.紧急集合(倍增LCA)

    有一棵树有 N 个结点,共有 M 次查询,每次询问树上三个点到树上哪个点汇合距离最近,输出这个汇合点和最短距离 倍增 LCA,每次询问两两求 LCA ,三个 LCA 深度最深的点是集合点. #incl ...

  7. Duan2baka的各种LCA模板!

    (这篇文章是模板向-了解具体思想还是看网上其他详细讲解吧QAQ) LCA,即最近公共祖先,是在有根树中两个点最近的公共祖先,在树上问题中非常有用QAQ 常用LCA求法: 一.树链剖分LCA 树链剖分L ...

  8. 洛谷T1967 货车运输 Kruskal最大生成树倍增LCA

    这题的题意是:对于每组x.y,求x到y路径上最小边权的最大值. 于是可以使用最大生成树,因为最大生成树满足性质:生成树中最小边权最大,且任意两点间路径上最小边权最大. 有了树之后,要求路径,那就要考虑 ...

  9. hdu 2586 How far away? (LCA模板)

    题意: N个点,形成一棵树,边有长度. M个询问,每个询问(a,b),询问a和b的距离 思路: 模板题,看代码.DFS预处理算出每个结点离根结点的距离. 注意: qhead[maxn],而不是qhea ...

最新文章

  1. EXCEL实现时间戳格式和日期格互转
  2. STM32开发 -- UCOSII移植
  3. x-code 4.61 无证书真机调试
  4. 2.1.Python字符串处理(去掉空格或者特殊字符、替换操作、查找操作、判断操作、分割合并操作、字符串文档)
  5. 机器学习实战(用Scikit-learn和TensorFlow进行机器学习)(五)
  6. selenium界面元素定位
  7. js判断是否在iframe中
  8. MySQL+Tomcat+JVM,看完还怕面试官
  9. www.cnblog.org无法访问了
  10. 广数980tc3从u盘复制到系统_广州数控GSK980TC3车床数控系统操作手册(选)
  11. 【天意使用教程系列】破解系统登录密码
  12. 元器件——瞬态抑制二极管TVS的选型应用总结(TVS的应用、TVS常用参数、TVS选型注意点、单向和双向TVS)
  13. 7-3 人民币与美元汇率兑换程序 (10分)
  14. plc是一台专用计算机对,PLC其实质上是一台工业控制用的专用计算机,它由硬件系统和软件系统两大部分组成...
  15. 如何玩转OA系统业务审批流程
  16. RK3328启动失败解决记录
  17. php的vget方法,ext_lanzou.php
  18. 免费申请 HTTPS 证书,开启全站 HTTPS
  19. 汤姆斯的天堂梦(par)
  20. SET的社会工程学攻击方法

热门文章

  1. 23个你意想不到的程序员逻辑神操作!
  2. 黄金游戏(一) - 从 A 股获利
  3. 计算机网络【谢希仁第七版】第六章【应用层】
  4. 你笑,我就告诉你我在想什么
  5. CRC校验(个人小结)
  6. SpringBoot项目引入的外部bean加载不到
  7. 西安更有理由重点发展大数据产业
  8. 阿里巴巴以9000万欧元收购德国大数据公司Data Artisans
  9. eclipse使用gradle
  10. 英文论文写作时态的问题