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. UML基础——统一建模语言简介

    到了21世纪——准确地说是2003年,UML已经获得了业界的认同.在我所见过的专业人员的简历中,75%都声称具备UML的知识.然而,在同绝大多数求职人员面谈之后,可以明显地看出他们并不真正了解UML. ...

  2. 列举一些常见的系统系能瓶颈 Common Bottlenecks

    http://www.nowamagic.net/librarys/veda/detail/2408在 Zen And The Art Of Scaling - A Koan And Epigram ...

  3. 统计时间段内周分类SQL语句

    declare @datefrom as datetime,@dateto as datetime set @datefrom='2015-04-12' set @dateto='2015-08-13 ...

  4. docker 容器自启动

    我们设置了docker自启动后,docker可以管理各种容器了,对于容器我们也可以设置重启的策略. 在容器退出或断电开机后,docker可以通过在容器创建时的--restart参数来指定重启策略: # ...

  5. 关于GridView Master-Detail 不支持明细属性为IEnumerable、IList问题

    默认状态下gridview不支持接口集合,即不支持属性类型为IEnumerable<T>或者扩展的IList<T>,只能乖乖的转成List等实体集合,这种取舍就是鱼和熊掌了,如 ...

  6. firefox因 HTTP 严格传输安全(HSTS)机制无法打开网页

    1.打开about:config 2.查找: security.enterprise_roots.enabled ,默认为false,改为true就可以了 3.吐槽,firefox太极端了,这是作死.

  7. [na]华为acl(traffic-filter)和dhcp管理

    这个是财务网络的一个问题, 要求财务的某台机器能访问其他部门区的打印机. 其他部门是不能访问到财务网络的. 华为alc配置实例:-traffic-filter # 在VLAN100上配置基于ACL的报 ...

  8. Objective-C函数重载规则

    是按照函数标签是否重复来判断是否为一个重载函数的.

  9. The Report Of Twisted’s Death or: Why Twisted and Tornado Are Relevant In The Asyncio Age

    Speech on PyCon2016 https://www.youtube.com/watch?v=82vuCZ4FLFE

  10. service文件(格林速洗项目)

    service文件模板:String url="http://59.78.93.208:9097/Order?id="+id+"&value="+val ...