http://acm.hdu.edu.cn/showproblem.php?pid=2586

给定一棵带权有根树,对于m个查询(u,v),求得u到v之间的最短距离

那么仅仅要求得LCA(u,v),dis(u,v)=dis[u]+dis[v]-2*dis[LCA(u,v)]。当中dis[i]表示节点i到根节点root的距离

31MS 4104K 2186 B

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<string>
#include<vector>
const int maxn=40010;
const int maxq=210;
using namespace std;
int n,m;
struct Edge{
int to,w;
int next;
}edge[maxn<<1];int head[maxn],tot;
struct Query{
int to,next;
int index;
}que[maxq<<1];int h[maxn],tt; void addedge(int u,int v,int w){
edge[tot].to=v;
edge[tot].w=w;
edge[tot].next=head[u];
head[u]=tot++;
}
void add_query(int u,int v,int index){
que[tt].to=v;
que[tt].index=index;
que[tt].next=h[u];
h[u]=tt++;
}
int f[maxn],dis[maxn],answer[maxq];
bool vis[maxn],in[maxn];
int find(int x){
return f[x]==-1 ? x:f[x]=find(f[x]);
}
void Union(int a,int b){
int t1=find(a);
int t2=find(b);
if(t1!=t2) f[t2]=t1;
}
void LCA(int u){
vis[u]=1;
for(int i=head[u];i!=-1;i=edge[i].next){
int v=edge[i].to;
if(vis[v]) continue;
dis[v]=dis[u]+edge[i].w;
LCA(v);
Union(u,v);
}
for(int i=h[u];i!=-1;i=que[i].next){
int v=que[i].to;
if(vis[v]){
answer[que[i].index]=dis[u]+dis[v]-2*dis[find(v)];
}
}
}
void Init(){
tot=tt=0;
memset(h,-1,sizeof(h));
memset(head,-1,sizeof(head));
memset(f,-1,sizeof(f));
memset(vis,false,sizeof(vis));
memset(in,false,sizeof(in));
memset(dis,0,sizeof(dis));
}
int main()
{
//#ifndef ONLINE_JUDGE
//freopen("in.cpp","r",stdin);
//#endif // ONLINE_JUDGE
int T,u,v,w;
cin>>T;
while(T--){
Init();
scanf("%d%d",&n,&m);
for(int i=0;i<n-1;++i){
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
in[v]=true;
}
for(int i=0;i<m;++i){
scanf("%d%d",&u,&v);
add_query(u,v,i);
add_query(v,u,i);
}
for(int i=1;i<=n;++i){
if(in[i]==false){
LCA(i);
break;
}
}
for(int i=0;i<m;++i){
printf("%d\n",answer[i]);
}
}
return 0;
}

HDU2586.How far away ?——近期公共祖先(离线Tarjan)的更多相关文章

  1. POJ1330Nearest Common Ancestors——近期公共祖先(离线Tarjan)

    http://poj.org/problem? id=1330 给一个有根树,一个查询节点(u,v)的近期公共祖先 836K 16MS #include<iostream> #includ ...

  2. 图论-最近公共祖先-离线Tarjan算法

    有关概念: 最近公共祖先(LCA,Lowest Common Ancestors):对于有根树T的两个结点u.v,最近公共祖先表示u和v的深度最大的共同祖先. Tarjan是求LCA的离线算法(先存储 ...

  3. POJ 1330 LCA最近公共祖先 离线tarjan算法

    题意要求一棵树上,两个点的最近公共祖先 即LCA 现学了一下LCA-Tarjan算法,还挺好理解的,这是个离线的算法,先把询问存贮起来,在一遍dfs过程中,找到了对应的询问点,即可输出 原理用了并查集 ...

  4. [HDOJ2586]How far away?(最近公共祖先, 离线tarjan, 并查集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 这题以前做过…现在用tarjan搞一发…竟然比以前暴力过的慢………… 由于是离线算法,需要Que ...

  5. 近期公共祖先(LCA)——离线Tarjan算法+并查集优化

    一. 离线Tarjan算法 LCA问题(lowest common ancestors):在一个有根树T中.两个节点和 e&sig=3136f1d5fcf75709d9ac882bd8cfe0 ...

  6. HDU 2586 How far away ?(LCA模板 近期公共祖先啊)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 Problem Description There are n houses in the vi ...

  7. LCA 近期公共祖先 小结

    LCA 近期公共祖先 小结 以poj 1330为例.对LCA的3种经常使用的算法进行介绍,分别为 1. 离线tarjan 2. 基于倍增法的LCA 3. 基于RMQ的LCA 1. 离线tarjan / ...

  8. LCA近期公共祖先

    LCA近期公共祖先 该分析转之:http://kmplayer.iteye.com/blog/604518 1,并查集+dfs 对整个树进行深度优先遍历.并在遍历的过程中不断地把一些眼下可能查询到的而 ...

  9. POJ 1470 Closest Common Ancestors【近期公共祖先LCA】

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013912596/article/details/35311489 题目链接:http://poj ...

  10. LintCode 近期公共祖先

    中等 近期公共祖先 查看执行结果 34% 通过 给定一棵二叉树,找到两个节点的近期公共父节点(LCA). 近期公共祖先是两个节点的公共的祖先节点且具有最大深度. 您在真实的面试中是否遇到过这个题? Y ...

随机推荐

  1. spring mvc 返回json的配置

    转载自:http://my.oschina.net/haopeng/blog/324934 springMVC-servlet.xml 配置 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

  2. js判断浏览器是否关闭

    http://www.blogjava.net/wyz191/archive/2008/12/08/245089.html JS   window.onunload=function(){      ...

  3. unity, multi collider

    比如下面鸭子模型,只用一个box collider难以很好地吻合其的外形. 我们可以为它添加两个box collider,如下图所示: 注意: 1,colliders一定要添加在模型根节点(即图中do ...

  4. Android_WebServices_源代码分析

    本博文为子墨原创,转载请注明出处! http://blog.csdn.net/zimo2013/article/details/38037989 在Android_WebServices_介绍一文中, ...

  5. linux 下面压缩,解压.rar文件以及rar,unrar实例

    http://www.rarlab.com/download.htm [root@bass src]# wget http://www.rarlab.com/rar/rarlinux-x64-5.4. ...

  6. 监控 Linux 性能的 18 个命令行工具(转)

    http://www.oschina.net/translate/command-line-tools-to-monitor-linux-performance?cmp&p=1# 1.Top- ...

  7. storyboard三种sugue 和 跳转场景的三种方式 以及控制器之间的传值

    Storyboard引入了2个概念:1. scene:一个场景,由一个viewController和相关的xib表示. 2. segue:在这是用于连接scenes,其有多种类型,iphone包括:P ...

  8. js基本知识3

    1. 函数 function 函数的声明 函数的 调用 函数的传参 2. 函数返回值 Return 返回结果 返回给函数 Id 函数 function $id(id) { return documen ...

  9. MongoDB Replica Set搭建集群

    MongoDB做集群,版本3.2官网推荐的集群方式Replica Set 准备服务器3台 两个standard节点(这两个节点直接可以互切primary secondary). 一个arbiter节点 ...

  10. C++中类所占的存储空间

    #include <iostream> using namespace std; class A { int m_a; int get() { return m_a; } virtual ...