1、一颗树中,给出a,b,求最近的距离。(我没考虑不联通的情况,即不是一颗树的情况)

2、用最近公共祖先来求,

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

3、

  1. /*
  2. 离线算法,LCATarjan
  3. 复杂度O(n+Q);
  4. */
  5. #include<iostream>
  6. #include<stdio.h>
  7. #include<string.h>
  8. using namespace std;
  9.  
  10. const int MAXN=;
  11. const int MAXQ=;//查询数的最大值
  12.  
  13. int dis[MAXN];//到根节点的距离
  14.  
  15. //并查集部分
  16. int F[MAXN];//需要初始化为-1
  17. int find(int x){
  18. if(F[x]==-)return x;
  19. return F[x]=find(F[x]);
  20. }
  21. void bing(int u,int v){
  22. int t1=find(u);
  23. int t2=find(v);
  24. if(t1!=t2)
  25. F[t1]=t2;
  26. }
  27. //***********************
  28. bool vis[MAXN];//访问标记
  29. int ancestor[MAXN];//祖先
  30. struct Edge{
  31. int to,next;
  32. int d;
  33. }edge[MAXN*];
  34. int head[MAXN],tot;
  35. void addedge(int u,int v,int d){
  36. edge[tot].to=v;
  37. edge[tot].d=d;
  38. edge[tot].next=head[u];
  39. head[u]=tot++;
  40. }
  41.  
  42. struct Query{
  43. int q,next;
  44. int index;//查询编号
  45. }query[MAXQ*];
  46. int answer[MAXQ];//存储最后的查询结果,下标0 Q-1
  47. int h[MAXN];//注意此处为MAXN...
  48. int tt;
  49.  
  50. void add_query(int u,int v,int index){
  51. query[tt].q=v;
  52. query[tt].next=h[u];
  53. query[tt].index=index;
  54. h[u]=tt++;
  55. query[tt].q=u;
  56. query[tt].next=h[v];
  57. query[tt].index=index;
  58. h[v]=tt++;
  59. }
  60.  
  61. void init(){
  62. tot=;
  63. memset(head,-,sizeof(head));
  64. tt=;
  65. memset(h,-,sizeof(h));
  66. memset(vis,false,sizeof(vis));
  67. memset(F,-,sizeof(F));
  68. memset(ancestor,,sizeof(ancestor));
  69. }
  70. void LCA(int u){
  71. ancestor[u]=u;
  72. vis[u]=true;
  73. for(int i=head[u];i!=-;i=edge[i].next){
  74. int v=edge[i].to;
  75. if(vis[v])continue;
  76. dis[v]=dis[u]+edge[i].d;
  77. LCA(v);
  78. bing(u,v);
  79. ancestor[find(u)]=u;
  80. }
  81. for(int i=h[u];i!=-;i=query[i].next){
  82. int v=query[i].q;
  83. if(vis[v]){
  84. answer[query[i].index]=ancestor[find(v)];
  85. }
  86. }
  87. }
  88.  
  89. int main(){
  90. int n,m;
  91. int i;
  92. int u,v,d;
  93. char str[];
  94.  
  95. init();
  96. scanf("%d%d",&n,&n);
  97. for(i=;i<n;++i){
  98. scanf("%d%d%d%1s",&u,&v,&d,str);
  99. addedge(u,v,d);
  100. addedge(v,u,d);
  101. }
  102. scanf("%d",&m);
  103. for(i=;i<m;++i){
  104. scanf("%d%d",&u,&v);
  105. add_query(u,v,i);
  106. }
  107. dis[]=;
  108. LCA();
  109. for(i=;i<m;++i){
  110. printf("%d\n",dis[query[i*].q]+dis[query[i*+].q]-*dis[answer[i]]);
  111. }
  112.  
  113. return ;
  114. }

POJ - 1986 Distance Queries(离线Tarjan算法)的更多相关文章

  1. POJ 1986 Distance Queries (Tarjan算法求最近公共祖先)

    题目链接 Description Farmer John's cows refused to run in his marathon since he chose a path much too lo ...

  2. POJ 1986 Distance Queries(Tarjan离线法求LCA)

    Distance Queries Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 12846   Accepted: 4552 ...

  3. POJ 1986 Distance Queries(LCA Tarjan法)

    Distance Queries [题目链接]Distance Queries [题目类型]LCA Tarjan法 &题意: 输入n和m,表示n个点m条边,下面m行是边的信息,两端点和权,后面 ...

  4. POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 【USACO】距离咨询(最近公共祖先)

    POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 [USACO]距离咨询(最近公共祖先) Description F ...

  5. POJ.1986 Distance Queries ( LCA 倍增 )

    POJ.1986 Distance Queries ( LCA 倍增 ) 题意分析 给出一个N个点,M条边的信息(u,v,w),表示树上u-v有一条边,边权为w,接下来有k个询问,每个询问为(a,b) ...

  6. POJ 1986 Distance Queries LCA两点距离树

    标题来源:POJ 1986 Distance Queries 意甲冠军:给你一棵树 q第二次查询 每次你问两个点之间的距离 思路:对于2点 u v dis(u,v) = dis(root,u) + d ...

  7. POJ 1986 Distance Queries 【输入YY && LCA(Tarjan离线)】

    任意门:http://poj.org/problem?id=1986 Distance Queries Time Limit: 2000MS   Memory Limit: 30000K Total ...

  8. POJ 1986 - Distance Queries - [LCA模板题][Tarjan-LCA算法]

    题目链接:http://poj.org/problem?id=1986 Description Farmer John's cows refused to run in his marathon si ...

  9. POJ 1986 Distance Queries (最近公共祖先,tarjan)

    本题目输入格式同1984,这里的数据范围坑死我了!!!1984上的题目说边数m的范围40000,因为双向边,我开了80000+的大小,却RE.后来果断尝试下开了400000的大小,AC.题意:给出n个 ...

  10. poj 1986 Distance Queries LCA

    题目链接:http://poj.org/problem?id=1986 Farmer John's cows refused to run in his marathon since he chose ...

随机推荐

  1. bootspring网站项目,Date类型插入数据库始终比正确时间早一天问题的解决

    bug描述 昨天的Date插入不进去问题解决后,一直没发现其实插入的时间一直比正确的时间早一天 输出sql语句,发现insert语句还是对的,不知道为什么插入数据库之后结果就早了一天 https:// ...

  2. unittest多线程生成报告(BeautifulReport)

    前言 selenium多线程跑用例,这个前面一篇已经解决了,如何生成一个测试报告这个是难点,刚好在github上有个大神分享了BeautifulReport,完美的结合起来,就能生成报告了. 环境必备 ...

  3. BeautifulSoup实例

    Beautiful Soup 4.4.0 中文文档:http://beautifulsoup.readthedocs.io/zh_CN/latest/ #coding:utf-8from bs4 im ...

  4. 聊聊flink的log.file配置

    本文主要研究一下flink的log.file配置 log4j.properties flink-release-1.6.2/flink-dist/src/main/flink-bin/conf/log ...

  5. @Temporal()注解的使用

    数据库的字段类型有date.time.datetime而Temporal注解的作用就是帮Java的Date类型进行格式化,一共有三种注解值: 第一种:@Temporal(TemporalType.DA ...

  6. Hotel(poj 3667)

    题意:询问区间最长连续空串 /* 用线段树维护区间最长连续左空串和右空串 */ #include<cstdio> #include<iostream> #define N 50 ...

  7. [转]android 如何获取第三方app的sha1值

    对于android 应用的sha1值和md5值的获取,如果是我们自己的应用,不论是获取测试的和正式的都是比较方便的.但是如何去获取别人开发的app的sha1和md5呢,并且我们只有apk有没有相关的文 ...

  8. [APIO2012] 派遣 dispatching

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 4580  Solved: 2348 Description 在一个忍者的帮派里,一些忍者们被选中派遣给 ...

  9. React Native资料汇总

    React Native 官方文档中文版翻译 http://wiki.jikexueyuan.com/project/react-native/homepage.html REACT NATIVE开发 ...

  10. codevs——3064 求和

    3064 求和  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 青铜 Bronze 题解  查看运行结果     题目描述 Description 输入一个数x(x <= ...