hdu2586 How far away ?(lca模版题)
2024-09-01 05:05:10
题目链接: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;
}
最新文章
- Angular2 小贴士-多级注入器
- .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(三)
- 如何优化tomcat配置(从内存、并发、缓存4个方面)优化
- $watch 和 $apply
- swun 1397 来电显示
- OWASP-ZAP
- bzoj2165
- Struts2 工作流程
- 多线程编程-- part 2 线程的生命周期和优先级
- Uva - 230 - Borrowers
- 涨姿势:Java 分业务、分级别实现自定义日志打印
- mybatis开发dao的方法——(三)
- 资产管理系统 CMDB 讲解
- Scrum团队 《构建之法》第6~7章
- 【BZOJ4247】挂饰(动态规划)
- HDOJ-3785 寻找大富翁(优先队列)
- python + docker, 实现天气数据 从FTP获取以及持久化(二)-- python操作MySQL数据库
- git命令学习汇总
- POJ-2563
- WCF公开服务元数据方式
热门文章
- QRCode生成二维码,jq QRCode生成二维码,QRCode生成电子名片
- 有助于提高";锁";性能的几点建议
- Spring cloud Feign不支持对象传参解决办法[完美解决]
- 简洁实用Socket框架DotNettySocket
- VS调试时修改代码
- python环境的安装 环境变量和系统变量
- memcached中hash表相关操作
- Cocos2d-x 学习笔记(3.2) TransitionScene 过渡场景和场景切换的过程
- hadoop2.7作业提交详解之文件分片
- canvas 鼠标位置缩放图形