题意:一个村子有n个房子,他们用n-1条路连接起来,每两个房子之间的距离为w。有m次询问,每次询问房子a,b之间的距离是多少。

分析:近期公共祖先问题,建一棵树,求出每一点i到树根的距离d[i],每次询问a。b之间的距离=d[a]+d[b]-2*d[LCA(a,b)];LCA(a,b)是a,b的近期公共祖先。

  1. #pragma comment(linker, "/STACK:1024000000,1024000000")
  2. #include<iostream>
  3. #include<vector>
  4. using namespace std;
  5.  
  6. #define N 50005
  7. vector<int> map[N],w[N],query[N],num[N];
  8. int p[N],d[N],res[N];
  9. bool vis[N];
  10. int n;
  11.  
  12. void Init()
  13. {
  14. int i;
  15. for(i=1;i<=n;i++)
  16. {
  17. map[i].clear();
  18. w[i].clear();
  19. query[i].clear();
  20. num[i].clear();
  21. p[i]=i;
  22. d[i]=0;
  23. vis[i]=false;
  24. }
  25. }
  26.  
  27. int Find(int x)
  28. {
  29. if(p[x]!=x)
  30. p[x]=Find(p[x]);
  31. return p[x];
  32. }
  33.  
  34. void Union(int x,int y)
  35. {
  36. x=Find(x);
  37. y=Find(y);
  38. if(x!=y)
  39. p[y]=x;
  40. }
  41.  
  42. void Tarjan(int cur,int v)
  43. {
  44. int size,i,tmp;
  45.  
  46. vis[cur]=true;
  47. d[cur]=v;
  48. size=map[cur].size();
  49. for(i=0;i<size;i++)
  50. {
  51. tmp=map[cur][i];
  52. if(vis[tmp]) continue;
  53. Tarjan(tmp,v+w[cur][i]);
  54. Union(cur,tmp);
  55. }
  56. size=query[cur].size();
  57. for(i=0;i<size;i++)
  58. {
  59. tmp=query[cur][i];
  60. if(!vis[tmp])continue;
  61. res[num[cur][i]]=d[cur]+d[tmp]-2*d[Find(tmp)];
  62. }
  63. }
  64.  
  65. int main()
  66. {
  67. int T,q,a,b,c,i;
  68.  
  69. scanf("%d",&T);
  70. while(T--)
  71. {
  72. scanf("%d%d",&n,&q);
  73. Init();
  74. for(i=1;i<n;i++)
  75. {
  76. scanf("%d%d%d",&a,&b,&c);
  77. map[a].push_back(b);
  78. w[a].push_back(c);
  79. map[b].push_back(a);
  80. w[b].push_back(c);
  81. }
  82. for(i=0;i<q;i++)
  83. {
  84. scanf("%d%d",&a,&b);
  85. query[a].push_back(b);
  86. query[b].push_back(a);
  87. num[a].push_back(i);
  88. num[b].push_back(i);
  89. }
  90. Tarjan(1,0);
  91. for(i=0;i<q;i++)
  92. printf("%d\n",res[i]);
  93. }
  94. return 0;
  95. }

HDU ACM 2586 How far away ?LCA-&gt;并查集+Tarjan(离线)算法的更多相关文章

  1. LCA最近公共祖先(Tarjan离线算法)

    这篇博客对Tarjan算法的原理和过程模拟的很详细. 转载大佬的博客https://www.cnblogs.com/JVxie/p/4854719.html 第二次更新,之前转载的博客虽然胜在详细,但 ...

  2. LCA(最近公共祖先)--tarjan离线算法 hdu 2586

    HDU 2586 How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  3. LCA问题的ST,tarjan离线算法解法

    一  ST算法与LCA 介绍 第一次算法笔记这样的东西,以前学算法只是笔上画画写写,理解了下,刷几道题,其实都没深入理解,以后遇到新的算法要把自己的理解想法写下来,方便日后回顾嘛>=< R ...

  4. 最近公共祖先LCA Tarjan 离线算法

    [简介] 解决LCA问题的Tarjan算法利用并查集在一次DFS(深度优先遍历)中完成所有询问.换句话说,要所有询问都读入后才开始计算,所以是一种离线的算法. [原理] 先来看这样一个性质:当两个节点 ...

  5. LCA 最近公共祖先 Tarjan(离线)算法的基本思路及其算法实现

    首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共的祖先节点. 换句话说,就是两个点在这棵 ...

  6. Luogu 2245 星际导航(最小生成树,最近公共祖先LCA,并查集)

    Luogu 2245 星际导航(最小生成树,最近公共祖先LCA,并查集) Description sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为 ...

  7. HDU 3081 Marriage Match II (二分图,并查集)

    HDU 3081 Marriage Match II (二分图,并查集) Description Presumably, you all have known the question of stab ...

  8. hdu 2586(Tarjan 离线算法)

    How far away ?                                                                             Time Limi ...

  9. HDU 1512 Monkey King(左偏树+并查集)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=1512 [题目大意] 现在有 一群互不认识的猴子,每个猴子有一个能力值,每次选择两个猴子,挑出他们所 ...

随机推荐

  1. 003.android资源文件剖析(Resources)

    android的资源文件使用的重要性,不言而喻.让我们从潜到深逐渐来了解吧. 一:android的基本资源: 1.字符串资源 android的资源文件保存在:res\values\ 2.布局资源 an ...

  2. ExtJs4 笔记(1) ExtJs大比拼JQuery:Dom文档操作

    现在主流的JS框架要数ExtJs和JQuery应用的比较广泛.JQuery属于轻量级的,一般做网站应用比较常见,可见块头小的优势.ExtJs比较庞大,它除了对基本的JS语法和HTML DOM操作方式的 ...

  3. 模拟new实例化对象。

    使用new和字面量的的方法是两种主流创建对象的方法,两种最终都能达到同样的实例化的对象,本章主要围绕new关键字来实例化一个对象并且讲一个不使用new但是完全与new实例化对象相同的例子. 在使用ne ...

  4. kiss框架学习

    #parse("$!jc.skinpath/exam/cart.ascx") var CategoryId = "$!this.loadCategory_combo(). ...

  5. Java的一些基础小知识之JVM与GC (转)

    一.JVM是什么 Java虚拟机(英语:Java Virtual Machine,缩写为JVM),又名爪哇虚拟器,一种能够运行Java bytecode的虚拟机,以堆栈结构机器来进行实做.最早由太阳微 ...

  6. hibernate学习(一)

    一.准备工作:导入jar包 1.hibernate的jar包 位置: hibernate-release-5.0.2.Final\hibernate-release-5.0.2.Final\lib\r ...

  7. zoj 3870

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5518 题意:n个数,从中选出两个数,问这两个数的异或值大于两个数较大 ...

  8. Selenium来抓取动态加载的页面

    一般的爬虫都是直接使用http协议,下载指定url的html内容,并对内容进行分析和抽取.在我写的爬虫框架webmagic里也使用了HttpClient来完成这样的任务. 但是有些页面是通过js以及a ...

  9. UVa 474 - Heads / Tails Probability

    题目:计算1/(2^n)的值的前4为有效数字以及位数. 分析:数论,大整数.直接用数组模拟就可以. 说明:打表计算.查询输出. #include <iostream> #include & ...

  10. 【POJ 1741】Tree

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 11570   Accepted: 3626 Description ...