传送门

题意:

  某村庄有n个小屋,n-1条道路连接着n个小屋(无环),求村庄A到村庄B的距离,要求是经过任一村庄不超过一次。

题解:

  求出 lca = LCA(u,v) , 然后答案便是dist[u] + dist[v] - 2 * dist[lca];

AC代码:

  1. #include<iostream>
  2. #include<vector>
  3. #include<cstdio>
  4. #include<cmath>
  5. #include<cstring>
  6. using namespace std;
  7. #define pb(x) push_back(x)
  8. #define mem(a,b) memset(a,b,sizeof(a))
  9. const int maxn=4e4+;
  10.  
  11. int n,q;
  12. int dist[maxn];//dist[i]: 节点i与节点1的距离,假定1为根节点
  13. int vs[*maxn];//欧拉序列
  14. int depth[*maxn];//深度序列
  15. int pos[maxn];//pos[i]:节点i在欧拉序列中第一次出现的位置
  16. bool vis[maxn];
  17. struct Edge
  18. {
  19. int to;
  20. int w;
  21. Edge(int a=,int b=):to(a),w(b){}
  22. };
  23. vector<Edge >G[maxn];
  24. void addEdge(int u,int v,int w)
  25. {
  26. G[u].pb(Edge(v,w));
  27. }
  28. struct RMQ
  29. {
  30. int dp[][*maxn];
  31. void rmq()
  32. {
  33. int tot=*n-;
  34. for(int i=;i <= tot;++i)
  35. dp[][i]=i;
  36. for(int k=;(<<k) <= tot;++k)
  37. for(int i=;((<<k)+i-) <= tot;++i)
  38. if(depth[dp[k-][i]] > depth[dp[k-][i+(<<(k-))]])
  39. dp[k][i]=dp[k-][i+(<<(k-))];
  40. else
  41. dp[k][i]=dp[k-][i];
  42. }
  43. int lca(int u,int v)
  44. {
  45. u=pos[u],v=pos[v];
  46. if(u > v)
  47. swap(u,v);
  48. int k=log(v-u+)/log();
  49. return vs[min(dp[k][u],dp[k][v-(<<k)+])];
  50. }
  51. }_rmq;
  52. void Dfs(int u,int dis,int dep,int &k)
  53. {
  54. vs[++k]=u;
  55. depth[k]=dep;
  56. pos[u]=k;
  57. dist[u]=dis;
  58. vis[u]=true;
  59. for(int i=;i < G[u].size();++i)
  60. {
  61. int to=G[u][i].to;
  62. int w=G[u][i].w;
  63. if(!vis[to])
  64. {
  65. Dfs(to,dis+w,dep+,k);
  66. vs[++k]=u;
  67. depth[k]=dep;
  68. }
  69. }
  70. }
  71. void LCA()
  72. {
  73. int k=;
  74. Dfs(,,,k);
  75. _rmq.rmq();
  76. }
  77. void Init()
  78. {
  79. mem(vis,false);
  80. for(int i=;i <= n;++i)
  81. G[i].clear();
  82. }
  83. int main()
  84. {
  85. // freopen("C:/Users/hyacinthLJP/Desktop/stdin/hdu2586.txt","r",stdin);
  86. int t;
  87. scanf("%d",&t);
  88. while(t--)
  89. {
  90. Init();
  91. scanf("%d%d",&n,&q);
  92. for(int i=;i < n;++i)
  93. {
  94. int u,v,w;
  95. scanf("%d%d%d",&u,&v,&w);
  96. addEdge(u,v,w);
  97. addEdge(v,u,w);
  98. }
  99. LCA();
  100. for(int i=;i <= q;++i)
  101. {
  102. int u,v;
  103. scanf("%d%d",&u,&v);
  104. int lca=_rmq.lca(u,v);
  105. printf("%d\n",dist[u]+dist[v]-*dist[lca]);
  106. }
  107. }
  108. return ;
  109. }

基于RMQ的LCA

hdu 2586(裸LCA)的更多相关文章

  1. How far away ? HDU - 2586 【LCA】【RMQ】【java】

    题目大意:求树上任意两点距离. 思路: dis[i]表示i到根的距离(手动选根),则u.v的距离=dis[u]+dis[v]-2*dis[lca(u,v)]. lca:u~v的dfs序列区间里,深度最 ...

  2. hdu 2874(裸LCA)

    传送门:Problem 2874 https://www.cnblogs.com/violet-acmer/p/9686774.html 改了一晚上bug,悲伤辣么大,明天再补详细题解 题解: 题目中 ...

  3. 【HDU 2586】LCA模板

    在一棵树上 求2个点的最短距离.那么首先利用LCA找到2个点的近期公共祖先 公式:ans = dis(x) + dis(y) - 2 * dis(lca(x,y)) 这里的dis(x)指的上x距离根节 ...

  4. HDU 2586(LCA欧拉序和st表)

    什么是欧拉序,可以去这个大佬的博客(https://www.cnblogs.com/stxy-ferryman/p/7741970.html)巨详细 因为欧拉序中的两点之间,就是两点遍历的过程,所以只 ...

  5. HDU - 2586 How far away ?(LCA模板题)

    HDU - 2586 How far away ? Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & ...

  6. hdu 2586 How far away ?倍增LCA

    hdu 2586 How far away ?倍增LCA 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2586 思路: 针对询问次数多的时候,采取倍增 ...

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

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

  8. HDU 2586 (LCA模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2586 题目大意:在一个无向树上,求一条链权和. 解题思路: 0 | 1 /   \ 2      3 ...

  9. HDU 2586 How far away ? (LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 LCA模版题. RMQ+LCA: #include <iostream> #incl ...

随机推荐

  1. 剑指offer:二叉树中和为某一值的路径

    本来这只是一个普通的算法题,但是当初自己OJ上提交时,总是提交失败,而我自己认定程序逻辑没有任何问题.然后开始就在本机上调试,结果发现这是由于Python的对象机制而引发的.所以先把问题算法题贴出来, ...

  2. spatial-temporal information extraction典型方法总结

    ==================================== 咳咳咳 由于科研的直接对象就是video sequence,所以,如何更好地提取spatial-temporal inform ...

  3. ASP.NET Forms验证

    /// <summary> /// 执行用户登录操作 /// </summary> /// <param name="config">授权配置信 ...

  4. jQuery(六)

    $下常用方法 $().xxx:只能给jq对象用 $.xxx不仅可以给jq用也可以给原生js用,叫做工具方法 $.type() <script> $(function(){ var a= n ...

  5. activiti-explorer disable demo

    https://community.alfresco.com/thread/203012-activiti-explorer engine.properties # demo data propert ...

  6. Angular @的作用

    <!DOCTYPE html><html lang="zh-cn" ng-app="myApp"><head> <me ...

  7. OA与BPM的区别

      BPM OA 软件架构 JAVA..NET.基于SOA架构 JAVA..NET.PHP.Domino 驱动模式 流程驱动 文档驱动 交互 人与人,人与系统,系统与系统 人与人 软件功能       ...

  8. Java 数组实现 stack

    首先定义 IStack package cn.com.example.stack; /** * Created by Jack on 2017/3/8. */ public interface ISt ...

  9. python之tkinter使用-单级菜单

    # 菜单功能说明:单级菜单 import tkinter as tk root = tk.Tk() root.title('菜单选择') root.geometry('200x60') # 设置窗口大 ...

  10. Java和Spring邮件的发送

    方法一: java发送电子邮件:这里以发送qq邮件为例: package test; import java.util.Properties; import javax.mail.Authentica ...