链接:https://ac.nowcoder.com/acm/contest/549/F
来源:牛客网

小A的最短路

时间限制:C/C++ 3秒,其他语言6秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

小A这次来到一个景区去旅游,景区里面有N个景点,景点之间有N-1条路径。小A从当前的一个景点移动到下一个景点需要消耗一点的体力值。但是景区里面有两个景点比较特殊,它们之间是可以直接坐观光缆车通过,不需要消耗体力值。而小A不想走太多的路,所以他希望你能够告诉它,从当前的位置出发到他想要去的那个地方,他最少要消耗的体力值是多少。

输入描述:

第一行一个整数N代表景区的个数。
接下来N-1行每行两个整数u,v代表从位置u到v之间有一条路径可以互相到达。
接下来的一行两个整数U,V表示这两个城市之间可以直接坐缆车到达。
接下来一行一个整数Q,表示有Q次询问。
接下来的Q行每行两个整数x,y,代表小A的位置在x,而他想要去的地方是y。

输出描述:

对于每个询问下x,y输出一个结果,代表x到y消耗的最少体力对于每个询问下x,y输出一个结果,代表x到y消耗的最少体力

示例1

输入

复制

4
1 2
1 3
2 4
3 4
2
1 3
3 4

输出

复制

1
0

备注:

1≤N≤3e5, 1≤Q≤1e6

下面这个视频讲解了联通分量和双连通分量以及LCA和最小树形图,挺不错的,看了一个小时基本就全懂了,好评~

https://www.bilibili.com/video/av27601307?share_medium=android&share_source=qq&bbid=2CA0A464-229E-40EA-9C93-EACE480D55486685infoc&ts=1555413736500

https://www.bilibili.com/video/av27601307?share_medium=android&share_source=qq&bbid=2CA0A464-229E-40EA-9C93-EACE480D55486685infoc&ts=1555413736500

然后再根据题解做题就可以了。

#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int N = 3e5 + 10;
int n,U,V;
int dep[N],dU[N],dV[N];
int fa[N][22];
vector<int> G[N];
int lca(int u,int v) {if(dep[u] > dep[v]) swap(u,v);for(int k = 20;k >= 0;k--) {if(dep[v] - dep[u] >= (1 << k)) {v = fa[v][k];}}if(u == v) return u;for(int k = 20;k >= 0;k--) {if(fa[u][k] != fa[v][k]) {u = fa[u][k];v = fa[v][k];}}return fa[u][0];
}
int query(int u,int v) {return dep[u] + dep[v] - 2 * dep[lca(u,v)];
}
void dfs(int u,int f,int d) {fa[u][0] = f;dep[u] = d;for(int i=0;i<G[u].size();i++){int v=G[u][i];if(v != f) dfs(v,u,d + 1);}}
void init() {for(int k = 1;k <= 20;k++) {for(int i = 1;i <= n;i++) {fa[i][k] = fa[fa[i][k - 1]][k - 1];}}
}
bool vis[N];
void bfs(int u,int *d) {memset(vis,0,sizeof(vis));queue<P> Q;Q.push(P {u,0});vis[u] = 1;while(!Q.empty()) {P p = Q.front(); Q.pop();for(int i=0;i<G[p.first].size();i++){int v=G[p.first][i];if(!vis[v]) {vis[v] = 1;d[v] = p.second + 1;Q.push(P {v,d[v]});}}}
}
int main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);cin >> n;for(int i = 1;i < n;i++) {int u,v;cin >> u >> v;G[u].push_back(v);G[v].push_back(u);}dfs(1,0,0);init();int Q;cin >> U >> V >> Q;bfs(U,dU);bfs(V,dV);while(Q--) {int u,v;cin >> u >> v;cout << min(query(u,v),min(dU[u] + dV[v],dU[v] + dV[u])) << endl;}return 0;
}

小A的最短路(LCA、倍增算法学习)相关推荐

  1. 倍增算法入门 超详细解答+LCA+RMQ(ST表)+例题剖析

    目录 一.倍增算法 二.倍增算法的应用:求LCA(最近公共祖先)附模板题 三.倍增算法的应用:RMQ 问题(ST表)附模板题 一.倍增算法 要了解倍增之前,强烈建议大家先看一下这位大佬对倍增的解释:[ ...

  2. 倍增算法入门 超详细解答+LCA+RMQ(ST表)+例题剖析

    目录 一.倍增算法 二.倍增算法的应用:求LCA(最近公共祖先)附模板题 三.倍增算法的应用:RMQ 问题(ST表)附模板题 一.倍增算法 要了解倍增之前,强烈建议大家先看一下这位大佬对倍增的解释:[ ...

  3. 牛客—— 小A的最短路 (LCA)

    [牛客] 小A的最短路 (LCA) 原题链接 题意: 给定一棵树,除给定的特殊边边权为0外,其余边权均为1.求两点之间的最短距离.n为3e5 思路: 今天碰到的第一道喜欢的题hhhhhh 题目是一棵树 ...

  4. tarjan算法_【朝夕的ACM笔记】树上问题-最近公共祖先-倍增算法

    [朝夕的ACM笔记]目录与索引 最近公共祖先-倍增算法 一.基本概念 最近公共祖先问题:对于给定的一颗有根树,求其两个节点的最近公共祖先. 祖先:节点本身.节点的父亲.节点父亲的父亲--都是该节点的祖 ...

  5. [BZOJ1602BZOJ1787BZOJ2144]树上LCA的算法巩固练习

    简述求LCA的倍增算法 对于树上的所有节点,我们可以很轻松地通过dfs求出其直接的父亲节点以及其深度 通过类似RMQ的原理我们可以处理出每个节点的第2^i个父亲 //这个过程既可以在dfs之后双重循环 ...

  6. LCA(倍增+Tarjan)和BFS、DFS以及Prim、Kruskal

    文章目录 LCA 倍增 并查集 题目背景 题目描述 输入格式 输出格式 输入输出样例 Tarjan算法 LCA和倍增 LCA和Tarjan 深度优先搜索 广搜BFS 最小生成树 普里姆算法(找点) 克 ...

  7. 【倍增算法】CF379F New Year Tree 题解

    In LuoGu 题目大意: 每次在给定节点增加两个点,动态输出当时树的直径,注意强制动态. 思路详解: 对于新加入的两个节点,新树的直径必定在两个点到另一个叶子节点的距离中,否则,新树的直径肯定和原 ...

  8. poj 3728 The merchant// lca(倍增实现) + dp || tarjan+并查集路径上dp

    poj 3728 The merchant// lca(倍增实现) + dp Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: ...

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

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

最新文章

  1. 我的4条产品设计工作观
  2. SAP Leonardo图片处理相关的机器学习服务在SAP智能服务场景中的应用
  3. eclipse里面自动添加get和set方法
  4. linux学习第四课:命令格式和目录处理命令
  5. Windows 7下可以使用的虚拟光驱软件
  6. 数值分析课后习题答案(百度网盘)
  7. word 2013 尾注后继续添加正文的方法
  8. 网络流24题 最小路径覆盖(DCOJ8002)
  9. LTE的核心网之:MME,SGW,PGW
  10. wxpython 按钮 扁平化_jquery mobile扁平化设计样式--Jquery mobile Flat UI介绍
  11. win10加装机械硬盘卡_以微软的技术实力,win10还会出现硬盘100%占用的问题,为什么呢...
  12. word2vec训练中文模型—wiki百科中文库
  13. 弱者易怒如虎,强者平静如水,真正厉害的人早已戒掉了情绪
  14. java计算机毕业设计校园环境保护监督系统源程序+mysql+系统+lw文档+远程调试
  15. css 平移到某个位置_Html基本的动画效果(平移,旋转)
  16. 邮件服务器搭建,可连接客户端
  17. proe 5.0的秘密
  18. 关于MVVM与MVI
  19. 3dmax 蒙皮 消失
  20. CURL 钉钉机器人 JSON 传参

热门文章

  1. 【渝粤教育】电大中专消费者行为学作业 题库
  2. 阿里云政企安全加速解决方案的技术架构与应用实践
  3. 人工蜂群算法(ABC算法)Java实现
  4. linux创建目录命令-----mkdir
  5. STM32 经过TM1637驱动四位数码管
  6. knn 识别自己的手写体
  7. Android KaptExecution:Annotation processors discovery from compile classpath is deprecated
  8. sqlserver中的if()
  9. 【功能业务篇】APP授权微信登录、绑定账号测试思考
  10. 安装 AutoCAD、Revit、Maya等 2020 错误 1625 系统策略禁止这个安装