HDU2586
最近的共同祖先反复问的问题。
#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的更多相关文章
- LCA在线算法(hdu2586)
hdu2586 How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- poj1330+hdu2586 LCA离线算法
整整花了一天学习了LCA,tarjan的离线算法,就切了2个题. 第一题,给一棵树,一次查询,求LCA.2DFS+并查集,利用深度优先的特点,回溯的时候U和U的子孙的LCA是U,U和U的兄弟结点的子孙 ...
- LCA 离线的Tarjan算法 poj1330 hdu2586
LCA问题有好几种做法,用到(tarjan)图拉算法的就有3种.具体可以看邝斌的博客.http://www.cnblogs.com/kuangbin/category/415390.html 几天的学 ...
- hdu2586 LCA
How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- How far away[HDU2586]
How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- HDU2586 How far away ?(LCA模板题)
题目链接:传送门 题意: 给定一棵树,求两个点之间的距离. 分析: LCA 的模板题目 ans = dis[u]+dis[v] - 2*dis[lca(u,v)]; 在线算法:详细解说 传送门 代码例 ...
- HDU2586 How far away ? 邻接表+DFS
题目大意:n个房子,m次询问.接下来给出n-1行数据,每行数据有u,v,w三个数,代表u到v的距离为w(双向),值得注意的是所修建的道路不会经过一座房子超过一次.m次询问,每次询问给出u,v求u,v之 ...
- hdu2586 lca倍增法
倍增法加了边的权值,bfs的时候顺便把每个点深度求出来即可 #include<iostream> #include<cstring> #include<cstdio> ...
- 模板倍增LCA 求树上两点距离 hdu2586
http://acm.hdu.edu.cn/showproblem.php?pid=2586 课上给的ppt里的模板是错的,wa了一下午orz.最近总是被坑啊... 题解:树上两点距离转化为到根的距离 ...
随机推荐
- VC POST表单——登录验证新浪邮箱
1.本机环境: Windows XP SP3.ADSL 2.开发工具: WildPackets OmniPeek V5.1.4 Visual C++ 6.0 IE6.0 FlexEdit V2.3.1 ...
- DOM手术台
CSS分类 排队: <div id="box" style="width:200px;border:1px solid red color:red;font-siz ...
- ubuntu 下搭建apache+python的运行环境
ubuntu下怎么搭建apache+python运行环境,可以参考http://www.01happy.com/ubuntu-apache-mod-python/ ,这里只是简单的记录下步骤,本文主要 ...
- 算法----选择排序(select sort)
排序不是一个时间的数组进行排序,找到最小的元素,其与阵列的第一个元素交换,因此,排序的数组. 算法: void sort::select_sort(int* a,const int n) { for( ...
- 高性能mysql主存架构
原文:高性能mysql主存架构 MySQL Replication(Master与Slave基本原理及配置) 主从mysql工作原理: 1:过程: (1)Mysql的复制(replication)是一 ...
- OpenGL缓冲区
OpenGL缓冲区 颜色缓冲区 OpenGL时,先是在一个缓冲区中完毕渲染,然后再把渲染结果交换到屏幕上. 我们把这两个缓冲区称为前颜色缓冲区(屏幕)和后颜色缓冲区.在默认情况下,OpenGL命令是在 ...
- 无插件,直接加参数,chrome它可以模拟手机浏览器
在目标出现,加上一些参数即可:--user-agent="mozilla/5.0 (linux; u; android 2.3.3; en-us; sdk build/ gri34) app ...
- OAuth和OpenID的区别(转)
OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth协议为用户资源的授权提 ...
- NVCC编译器
http://blog.csdn.net/bendanban/article/details/8518382 mark一下 几个方案可以用: 方案1: 将所有文件分别编译,最后统一合并! 对于C程序 ...
- HDU 4349 Xiao Ming's Hope
非常无语的一个题. 反正我后来看题解全然不是一个道上的. 要用什么组合数学的lucas定理. 表示自己就推了前面几个数然后找找规律. C(n, m) 就是 组合n取m: (m!(n-m!)/n!) 假 ...