在一棵树上 求2个点的最短距离。那么首先利用LCA找到2个点的近期公共祖先

公式:ans = dis(x) + dis(y) - 2 * dis(lca(x,y))

这里的dis(x)指的上x距离根节点的距离

注意一些细节方面,比方数组的越界问题:

#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn = 45555;
struct Edge{
int to;
LL dist;
Edge(int to,LL dist):to(to),dist(dist){};
};
int n,m;
int deep[maxn],pa[maxn][22];
LL dis[maxn];
vector<Edge>G[maxn];
void init(){
memset(pa,-1,sizeof(pa));
for(int i = 1; i <= n; i++) G[i].clear();
}
//----------------LAC---------------------------
void dfs(int pos,int d,LL dist){
//printf("[%d %d]\n",pos,dist);
deep[pos] = d;
dis[pos] = dist;
int Size = G[pos].size();
for(int i = 0; i < Size; i++)
dfs(G[pos][i].to,d + 1,dist + G[pos][i].dist);
}
void lca_init(){
for(int j = 1; (1 << j) <= n; j++)
for(int i = 1; i <= n; i++)
if(pa[i][j - 1] != -1)
pa[i][j] = pa[pa[i][j - 1]][j - 1];
}
int lca(int a,int b){
if(a == b)
return a;
if(deep[a] < deep[b]) swap(a,b);
int i;
for(i = 0;(1 << i) <= deep[a]; i++);
for(int j = i; j >= 0; j--)
if(pa[a][j] != -1 && deep[pa[a][j]] >= deep[b])
a = pa[a][j];
if(a == b)
return b;
for(int j = i; j >= 0; j--)
if(pa[a][j] != -1 && deep[pa[a][j]] != deep[pa[b][j]]){
a = pa[a][j];
b = pa[b][j];
}
return pa[a][0];
}
//-------------------------------------------------
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
int x,y,z;
init();
for(int i = 0; i < n - 1; i++){
scanf("%d%d%d",&x,&y,&z);
G[x].push_back(Edge(y,z));
pa[y][0] = x;
}
for(int i = 1; i <= n; i++)if(pa[i][0] == -1){
dfs(i,0,0);
break;
}
lca_init();
for(int i = 0; i < m; i++){
scanf("%d%d",&x,&y);
LL ans = dis[x] + dis[y] - 2 * dis[lca(x,y)];
printf("%I64d\n",ans);
}
}
return 0;
}

最新文章

  1. 还有 3 天,苹果就要关上 HTTP 大门了
  2. 【JAVA】【leetcode】【查找二叉树最小深度】
  3. 第一周:设计一个简易ATM取款机简易程序(2)
  4. Codeforces 549B. Looksery Party[构造]
  5. localStorage和sessionStorage
  6. oracle中的连接查询与合并查询总结
  7. curl命令使用小结[转]
  8. MYSQL命令cmd操作
  9. ADXL345经验总结,采用SPI和I2C总线操作
  10. AsyncTask机制
  11. dc的博客翻修计划启动
  12. Mysql5.5安装
  13. queue模拟
  14. IOS端的摇一摇功能
  15. SQL语句添加删除修改字段[sql server 2000/2005]
  16. 【OC底层】一个OC对象占用多少内存?
  17. new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。
  18. php调用C代码的方法详解和zend_parse_parameters函数详解
  19. jmeter 接口测试
  20. [ 东莞市选 2008 ] GCD&amp;LCM

热门文章

  1. AE 打开工具箱工具的对话框
  2. ionic新手教程第八课-(加更)从无到有说Ionic、绘图说明MVC-U-S
  3. CentOS6.4下Samba服务器的安装与配置
  4. 【python】Django设置SESSION超时时间没有生效?
  5. 【云计算】使用docker搭建nfs实现容器间共享文件
  6. (笔试题)关于C++的虚函数和多态性
  7. (LeetCode 53)Maximum Subarray
  8. Android多点触控技术,实现对图片的放大缩小平移,惯性滑动等功能
  9. 你们对LinearLayout线性布局中Layout_weight的误解
  10. 使用 RDVTabBarController 制作底部凸起的 TabBar 笔记