题意:给一棵树,询问u和v之间的边权和。

解题思路:找到u和v的最近公共祖先,它们之间的距离为dis[u]+dis[v]-2*dis[lca(u,v)]

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;const int maxn = 40005;
struct Edge
{int k,next,cost;
}edge[maxn<<1];
struct Ask
{int k,next,id;
}ask[maxn<<1];
int n,m,cnt1,cnt2,pre[maxn],head[maxn];
int dis[maxn],fa[maxn];
int ans[maxn],color[maxn];
bool vis[maxn];void addedge(int u,int v,int c)
{edge[cnt1].k = v;edge[cnt1].cost = c;edge[cnt1].next = pre[u];pre[u] = cnt1++;
}void addask(int u,int v,int id)
{ask[cnt2].k = v;ask[cnt2].next = head[u];ask[cnt2].id = id;head[u] = cnt2++;
}int find(int x)
{if(fa[x] == x) return x;return fa[x] = find(fa[x]);
}void Tarjan(int u,int len)
{vis[u] = true;fa[u] = u;dis[u] = len;for(int i = pre[u]; i != -1; i = edge[i].next){int v = edge[i].k;if(vis[v]) continue;Tarjan(v,len + edge[i].cost);fa[v] = u;}color[u] = 1;for(int i = head[u]; i != -1; i = ask[i].next){int v = ask[i].k;if(color[v]){int ancestor = find(v);ans[ask[i].id] = dis[u] + dis[v] - 2*dis[ancestor];}}
}int main()
{int t,u,v,c;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);memset(pre,-1,sizeof(pre));memset(head,-1,sizeof(head));cnt1 = cnt2 = 0;for(int i = 1; i < n; i++){scanf("%d%d%d",&u,&v,&c);addedge(u,v,c);addedge(v,u,c);}for(int i = 1; i <= m; i++){scanf("%d%d",&u,&v);addask(u,v,i);addask(v,u,i);}memset(vis,false,sizeof(vis));Tarjan(1,0);for(int i = 1; i <= m; i++)printf("%d\n",ans[i]);}return 0;
}

hdu 2586(LCA + 节点间距离)相关推荐

  1. hdu 2874(LCA + 节点间距离)

    解题思路:Tarjan离线处理 一篇介绍LCA的很好的博客:http://www.cppblog.com/menjitianya/archive/2015/12/10/212447.html #inc ...

  2. hdu 2586(LCA的离线做法)

    lca上的tarjan,改了我一下午加一晚上的bug,还无奈重写了一次.就是寻找最近公共祖先lca(u,v #include <iostream> #include <cstring ...

  3. hdu 2586 (LCA)

    最近公共祖先.. 表示卡在一个位置卡了很久..思维还是差了些,在一颗树上记录距离只需记录到根结点的距离,如果要求两个点的距离(一个点时另一个点的祖先)只需将他们到根结点的距离相减就行了. 唉,其他的就 ...

  4. HDU 2586 How far away ? LCA ---tanjar+并查集 离线算法

    tanjar算法离线求LCA的思想主要是利用并查集的思想. 求距离的话就是d[start[i]]+end[en[i]]-2*d[lca[i]]; 首先从根节点dfs,在深度遍历的回溯的过程中不断的更新 ...

  5. HDU - 2586 How far away LCA+tanjar离线算法

    传送门 题意:求树上的两点的距离,放在一棵树上,而且题目提示只有一条,很明显是这条路线一定会经过他们的最近公共祖先啦,然后就是一个求距离的问题了.如果要采用离线算法的话,就是通过处理所有询问,那么肯定 ...

  6. HDU - 2586 How far away ?(离线Tarjan算法)

    1.给定一棵树,每条边都有一定的权值,q次询问,每次询问某两点间的距离. 2.这样就可以用LCA来解,首先找到u, v 两点的lca,然后计算一下距离值就可以了. 这里的计算方法是,记下根结点到任意一 ...

  7. 【IT笔试面试题整理】 二叉树任意两个节点间最大距离

    求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是这两个节点间边的个数, 比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度. 一种是:经过根节点,此时只 ...

  8. 【数据挖掘】基于层次的聚类方法 ( 聚合层次聚类 | 划分层次聚类 | 族间距离 | 最小距离 | 最大距离 | 中心距离 | 平均距离 | 基于层次聚类步骤 | 族半径 )

    文章目录 基于层次的聚类方法 简介 基于层次的聚类方法 概念 聚合层次聚类 图示 划分层次聚类 图示 基于层次的聚类方法 切割点选取 族间距离 概念 族间距离 使用到的变量 族间距离 最小距离 族间距 ...

  9. 二叉树节点间的最大距离问题

    二叉树节点间的最大距离问题 从二叉树的节点 A 出发,可以向上或者向下走,但沿途的节点只能经过一次,当到达节点 B 时,路 径上的节点数叫作 A 到 B 的距离.求整棵树上节点间的最大距离. 如果二叉 ...

最新文章

  1. matlab图像处理命令(二)
  2. 自制pyBoard的I2C实验,应用MicroPython
  3. Android Studio 编译: Program type already present: XXX 解决方案
  4. 我诞生了!祝贺我吧。
  5. js设计模式-组合模式
  6. JavaScript:prototype属性使用说明
  7. [JDK]找不到或无法加载主类 java
  8. 关于WinForms的跨显示器DPI自适应
  9. 浏览器自带的前进后退按钮禁用
  10. hutool的定时任务不支持依赖注入怎么办_可调度定时任务在SpringBoot中的实践
  11. 手工制作机器人用彩泥_印度神奇芒果干制作过程,看一遍顶三遍,游客:不会再吃了...
  12. 解含待定变量微分方程组
  13. Office 365 On MacOS 系列——安装 O365 其他组件
  14. Linux内核中的信号量解析
  15. OpenGL超级宝典第五版 Windows + VS2013配置
  16. 物联网周刊(第 5 期):智能家居入口之争
  17. Code Sign error: Provisioning profile '6805769A-5085-4BE7-B9D1-2859CD2CBE9E' can't be found
  18. linux系统配置交换机指令,【001】H3C交换机命令使用介绍
  19. mj评[杜拉拉升职记]-8.5分
  20. 【CCS仿真系列教程】手把手教你纯软件仿真实现音频滤波

热门文章

  1. 大型分布式C++框架《四:netio之请求包中转站 上》
  2. OpenCV基础篇之读取显示图片
  3. 小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(一)视图共性 学习笔记...
  4. Object-C---gt;Swift之(三)nil合并运算符、范围运算符
  5. iftop是一个很好用的实时流量监测程序,跟使用iftop查看linux连接进程占用的实时流量...
  6. 快速制作你的虚拟头像
  7. vc2010多线程使用std标准模板库容器DEBUG版迭代器BUG
  8. 如何利用手持终端信息化仓储管理呢
  9. nginx大量TIME_WAIT的解决办法 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'...
  10. 项目托管到GitHub及简单使用