1、给定一棵树,每条边都有一定的权值,q次询问,每次询问某两点间的距离。

2、这样就可以用LCA来解,首先找到u, v 两点的lca,然后计算一下距离值就可以了。

这里的计算方法是,记下根结点到任意一点的距离dis[],这样ans = dis[u] + dis[v] - 2 * dis[lca(u, v)]

3、

/*
离线算法,LCATarjan
复杂度O(n+Q);
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;const int MAXN=40005;
const int MAXQ=205;//查询数的最大值int dis[MAXN];//到根节点的距离//并查集部分
int F[MAXN];//需要初始化为-1
int find(int x){if(F[x]==-1)return x;return F[x]=find(F[x]);
}
void bing(int u,int v){int t1=find(u);int t2=find(v);if(t1!=t2)F[t1]=t2;
}
//***********************
bool vis[MAXN];//访问标记
int ancestor[MAXN];//祖先
struct Edge{int to,next;int d;
}edge[MAXN*2];
int head[MAXN],tot;
void addedge(int u,int v,int d){edge[tot].to=v;edge[tot].d=d;edge[tot].next=head[u];head[u]=tot++;
}struct Query{int q,next;int index;//查询编号
}query[MAXQ*2];
int answer[MAXQ];//存储最后的查询结果,下标0 Q-1
int h[MAXN];//注意此处为MAXN...
int tt;void add_query(int u,int v,int index){query[tt].q=v;query[tt].next=h[u];query[tt].index=index;h[u]=tt++;query[tt].q=u;query[tt].next=h[v];query[tt].index=index;h[v]=tt++;
}void init(){tot=0;memset(head,-1,sizeof(head));tt=0;memset(h,-1,sizeof(h));memset(vis,false,sizeof(vis));memset(F,-1,sizeof(F));memset(ancestor,0,sizeof(ancestor));
}
void LCA(int u){ancestor[u]=u;vis[u]=true;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].d;LCA(v);bing(u,v);ancestor[find(u)]=u;}for(int i=h[u];i!=-1;i=query[i].next){int v=query[i].q;if(vis[v]){answer[query[i].index]=ancestor[find(v)];}}
}int main(){int T;int n,m;int i;int u,v,d;scanf("%d",&T);while(T--){init();scanf("%d%d",&n,&m);for(i=0;i<n-1;++i){scanf("%d%d%d",&u,&v,&d);addedge(u,v,d);addedge(v,u,d);}for(i=0;i<m;++i){scanf("%d%d",&u,&v);add_query(u,v,i);}dis[1]=0;LCA(1);for(i=0;i<m;++i){printf("%d\n",dis[query[i*2].q]+dis[query[i*2+1].q]-2*dis[answer[i]]);}}return 0;
}

View Code

转载于:https://www.cnblogs.com/bofengyu/p/4963515.html

HDU - 2586 How far away ?(离线Tarjan算法)相关推荐

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

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

  2. 【HDU - 1269】迷宫城堡 (tarjan算法模板)

    题干: 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只 ...

  3. 【HDU 1269】迷宫城堡 (Tarjan算法)

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  4. 有向图强连通分量tarjan算法

    转自:http://www.byvoid.com/blog/scc-tarjan/ http://blog.csdn.net/geniusluzh/article/details/6601514 在有 ...

  5. 【转】BYV--有向图强连通分量的Tarjan算法

    转自beyond the void 的博客: https://www.byvoid.com/zhs/blog/scc-tarjan 注:红色为标注部分 [有向图强连通分量] 在有向图G中,如果两个顶点 ...

  6. byvoid 神牛的tarjan算法讲解!

    [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通 (strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图 .非强连通图有向图 ...

  7. 有向图强连通分量的Tarjan算法——转自BYVoid

    [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...

  8. [转载] 有向图强连通分量的Tarjan算法 ——byvoid

    [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...

  9. 有向图强连通分量的Tarjan算法

    有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大 ...

最新文章

  1. python装饰器+迭代器+生成器
  2. 人工智能进军餐饮:AI调酒,越喝越有
  3. 小程序中Cannot read property ‘setData‘ of undefined问题的解决
  4. linux 后台任务 运行 关闭 查看
  5. 【Azure Services Platform Step by Step-第5篇】.NET Services 概述
  6. 消息推送服务器令牌,小程序-消息推送配置Token令牌错误校验失败如何解决
  7. Perl语言入门-第四章-子程序-习题
  8. HBase优化案例分析:Facebook Messages系统问题与解决方案
  9. Quartus17下载程序进FPGA
  10. ASP.NET 2.0 Web Part编程之定制Web Part
  11. 【L298N 驱动电机的线路连接图】
  12. Opencv实现身份证OCR识别
  13. C++正则表达式(regex_match、regex_search与regex_replace)
  14. 【实战】Spring+Spring MVC+Mybatis实战项目之云笔记项目
  15. Redis实现分布式锁(setnx、getset、incr)以及如何处理超时情况(一)
  16. 卢卡斯定理及python实现
  17. 盛世昊通董车长APP新功能上线,看视频获收益
  18. Linux LVM 总结
  19. 近日我方收到大量用户QQ发送涉黄图低俗等文字,腾讯QQ回应疑似被盗号!
  20. 关于人工智能,你知道怎么学吗

热门文章

  1. python __repr__
  2. Scala Case
  3. opencv SIFT角检测
  4. 微型计算机天逸510s光驱,主机届的小钢炮,性能最强NAS——天逸510S Mini
  5. 对象存储 OSS > 产品简介 > 什么是对象存储OSS
  6. 滴普科技,全场景数据智能服务商
  7. Docker禁令生效,开始限制所有被美国列入实体清单的公司和个人使用Docker
  8. Spring学习总结(27)——Spring常用注解再总结
  9. harbor 多端口_总结—Harbor仓库部署和使用问题集锦
  10. linux文件系统管理实践题目,Linux软件管理、文件系统管理实践