最近的共同祖先反复问的问题。

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
using namespace std; const int MAXN = 40000 + 10;
struct Edge{
int to,cost;
Edge(){};
Edge(int _to,int _cost)
:to(_to),cost(_cost){};
}; vector<Edge> tree[MAXN];
vector<Edge> Qes[MAXN];
int degree[MAXN];
int f[MAXN];
bool vst[MAXN];
int dist[MAXN];
int ancestor[MAXN];
int ans[MAXN];
int rank[MAXN];
int N,M; void init(){
for(int i = 0;i <= N;++i){
degree[i] = 0;
f[i] = i;
ans[i] = -1;
rank[i] = 0;
dist[i] = 0;
vst[i] = false;
ancestor[i] = -1;
tree[i].clear();
Qes[i].clear();
}
} int Find(int x){
if(x == f[x])
return x;
return f[x] = Find(f[x]);
} void LCA(int u){
int sz = tree[u].size();
for(int i = 0;i < sz;++i){
Edge& e = tree[u][i];
if(!vst[e.to]){
vst[e.to] = 1;
dist[e.to] = dist[u] + e.cost;
LCA(e.to);
f[e.to] = u;
int k = Qes[e.to].size();
for(int j = 0;j < k;++j){
Edge& et = Qes[e.to][j];
if(vst[et.to]&&ans[et.cost] == -1){ //还未遍历到
if(et.to == e.to) ans[et.cost] = 0;
else ans[et.cost] = dist[e.to] + dist[et.to] - 2*dist[Find(et.to)];
}
}
}
}
} int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&N,&M);
init();
int x,y,c;
for(int i = 1;i < N;++i){
scanf("%d%d%d",&x,&y,&c);
tree[x].push_back(Edge(y,c));
tree[y].push_back(Edge(x,c));
} for(int i = 0;i < M;++i){
scanf("%d%d",&x,&y);
Qes[x].push_back(Edge(y,i));
Qes[y].push_back(Edge(x,i));
} vst[1] = 1;
LCA(1); for(int i = 0;i < M;++i){
printf("%d\n",ans[i]);
}
}
return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

HDU2586的更多相关文章

  1. LCA在线算法(hdu2586)

    hdu2586 How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  2. poj1330+hdu2586 LCA离线算法

    整整花了一天学习了LCA,tarjan的离线算法,就切了2个题. 第一题,给一棵树,一次查询,求LCA.2DFS+并查集,利用深度优先的特点,回溯的时候U和U的子孙的LCA是U,U和U的兄弟结点的子孙 ...

  3. LCA 离线的Tarjan算法 poj1330 hdu2586

    LCA问题有好几种做法,用到(tarjan)图拉算法的就有3种.具体可以看邝斌的博客.http://www.cnblogs.com/kuangbin/category/415390.html 几天的学 ...

  4. hdu2586 LCA

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  5. How far away[HDU2586]

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  6. HDU2586 How far away ?(LCA模板题)

    题目链接:传送门 题意: 给定一棵树,求两个点之间的距离. 分析: LCA 的模板题目 ans = dis[u]+dis[v] - 2*dis[lca(u,v)]; 在线算法:详细解说 传送门 代码例 ...

  7. HDU2586 How far away ? 邻接表+DFS

    题目大意:n个房子,m次询问.接下来给出n-1行数据,每行数据有u,v,w三个数,代表u到v的距离为w(双向),值得注意的是所修建的道路不会经过一座房子超过一次.m次询问,每次询问给出u,v求u,v之 ...

  8. hdu2586 lca倍增法

    倍增法加了边的权值,bfs的时候顺便把每个点深度求出来即可 #include<iostream> #include<cstring> #include<cstdio> ...

  9. 模板倍增LCA 求树上两点距离 hdu2586

    http://acm.hdu.edu.cn/showproblem.php?pid=2586 课上给的ppt里的模板是错的,wa了一下午orz.最近总是被坑啊... 题解:树上两点距离转化为到根的距离 ...

随机推荐

  1. maven学习系列(一)—maven安装和基本设置

    maven下载和配置 第一步:下载apache-maven-2.3.2-bin.zip并解压到D:\tools,下载地址http://maven.apache.org/download.cgi 第二步 ...

  2. ISAPI_Rewrite 3 伪静态软件

    下载地址 http://www.helicontech.com/isapi_rewrite/download.html

  3. IE6浏览器的一些问题

    背景图像缓存 // IE6 background image caching fix. try { document.execCommand("BackgroundImageCache&qu ...

  4. 华为-on演习--身高找到最好的二人

    称号: 从5个人选择2作为个人礼仪器.中的每个个体的身高的范围160-190,要求2各高度差值至少(假设差异值同样的事情,他们中最高的选择),输出的两个人的身高升序. Smple input:161  ...

  5. C# winform 实现 qq 在屏幕边缘 自动隐藏 鼠标移过去 移上去 又自动显示

    代码下载地址   http://download.csdn.net/detail/simadi/7677147

  6. SQL Server 2008 R2 跟踪标志

    原文:SQL Server 2008 R2 跟踪标志 跟踪标志用于临时设置特定服务器的特征或关闭特定行为.例如,如果启动 SQL Server 的一个实例时设置了跟踪标志 3205,将禁用磁带机的硬件 ...

  7. hibernate它 11.many2many双向

    表结构: 类图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd29iZW5kaWFua3Vu/font/5a6L5L2T/fontsize/400/fi ...

  8. Android手机定位技术的发展

    基于以下三种方式的移动位置:1. 网络位置 :2. 基站定位. 3. GPS定位 1 网络位置 前提是连接到网络:Wifi.3G.2G 到达IP址  比如:彩虹版QQ,珊瑚虫版QQ,就有一个功能显示对 ...

  9. Scala 专题指南

    Scala 专题教程-Case Class和模式匹配 Scala 专题教程-Case Class和模式匹配(1):简单的演示样例 Scala 专题教程-Case Class和模式匹配(2): 模式的种 ...

  10. Path和ClassPath差异

    1.Path角色 Path它用于指定Java路径的命令,当我们想编译Java当需要使用的程序javac.exe并运行.class当文件需要使用java.exe,此时Path设置的路径就发生作用了.由于 ...