传送门

(这次的英文题面要比上一个容易看多了)

(英语蒟蒻的卑微)

又是一个很裸的LCA题

(显然,这次不太容易打暴力咧)

(但听说还是有大佬用dfs直接a掉了)

正好

趁这个机会复习一下LCA

这里用的是倍增lca

的思想(一不小心是会写tle的吧)

(也有可能是因为我太弱了才t掉的)

我才不会说我有一次卑微了

一开始看PPT

以为自己明白了

结果发现

有一点点问题

由于本题中这个树是题里给的

所以节点的编号不可以简简单单认为是从上到下从左到右顺序排列的

(但其实这部算什么大问题啊qwq)

(还是我太弱了)

长记性了的我这次记住了要加'\n'

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #define maxn 40000
  5. using namespace std;
  6.  
  7. struct EDGE
  8. {
  9. int nxt,to,v;
  10. }edge[maxn*+];
  11.  
  12. int T,n,root,cnt,m;
  13. int head[maxn+],dep[maxn+],dis[maxn+];
  14. int f[maxn+][];
  15. bool vis[maxn+];
  16.  
  17. void add(int x,int y,int z)
  18. {
  19. edge[++cnt].to=y;
  20. edge[cnt].v=z;
  21. edge[cnt].nxt=head[x];
  22. head[x]=cnt;
  23. }
  24.  
  25. void dfs(int u,int fa)
  26. {
  27. dep[u]=dep[fa]+;
  28. for(int i=; i<=; i++)
  29. {
  30. f[u][i+]=f[f[u][i]][i];
  31. }
  32. for(int i=head[u]; i; i=edge[i].nxt)
  33. {
  34. if(edge[i].to==fa)
  35. {
  36. continue;
  37. }
  38. dis[edge[i].to]=dis[u]+edge[i].v;
  39. f[edge[i].to][]=u;
  40. dfs(edge[i].to,u);
  41. }
  42. }
  43.  
  44. int LCA(int x,int y)
  45. {
  46. if(dep[x]<dep[y])
  47. {
  48. swap(x,y);
  49. }
  50. for(int i=; i>=; i--)
  51. {
  52. if(dep[f[x][i]]>=dep[y])
  53. {
  54. x=f[x][i];
  55. }
  56. if(x==y)
  57. {
  58. return x;
  59. }
  60. }
  61. for(int i=; i>=; i--)
  62. {
  63. if(f[x][i]!=f[y][i])
  64. {
  65. x=f[x][i];
  66. y=f[y][i];
  67. }
  68. }
  69. return f[x][];
  70. }
  71.  
  72. int main()
  73. {
  74. scanf("%d",&T);
  75. while(T--)
  76. {
  77. memset(vis,,sizeof(vis));
  78. memset(edge,,sizeof(edge));
  79. memset(f,,sizeof(f));
  80. memset(dep,,sizeof(dep));
  81. memset(head,,sizeof(head));
  82. memset(dis,,sizeof(dis));
  83. cnt=;
  84. scanf("%d%d",&n,&m);
  85. for(int i=; i<=n-; i++)
  86. {
  87. int x,y,z;
  88. scanf("%d%d%d",&x,&y,&z);
  89. vis[y]=;
  90. add(x,y,z);
  91. add(y,x,z);
  92. }
  93. for(int i=; i<=n; i++)
  94. {
  95. if(vis[i]==)
  96. {
  97. root=i;
  98. break;
  99. }
  100. }
  101. dfs(root,);
  102. for(int i=; i<=m; i++)
  103. {
  104. int a,b;
  105. scanf("%d%d",&a,&b);
  106. printf("%d\n",dis[a]+dis[b]-*dis[LCA(a,b)]);
  107. }
  108. }
  109. return ;
  110. }

hdu - 2586 (LCA板子题)的更多相关文章

  1. HDU 2586 (LCA模板题)

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

  2. [hdu 2586]lca模板题(在线+离线两种版本)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 在线版本: 在线方法的思路很简单,就是倍增.一遍dfs得到每个节点的父亲,以及每个点的深度.然后 ...

  3. bzoj-1787-洛谷-4281(LCA板子题)

    传送门(bzoj) 传送门(洛谷) 可以说这道也是一个板子题 由于题中是三个人需经过的路径最短 就会有一点点不太一样 那么 就两两求LCA 这样之后就会出现两种状况 一.所得到的三个LCA是相等的 那 ...

  4. HDU 2586 ( LCA/tarjan算法模板)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:n个村庄构成一棵无根树,q次询问,求任意两个村庄之间的最短距离 思路:求出两个村庄的LCA,d ...

  5. hdu 2586(LCA在线ST)

    How far away ? Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): A ...

  6. HDU 2586 LCA

    题目大意: 多点形成一棵树,树上边有权值,给出一堆询问,求出每个询问中两个点的距离 这里求两个点的距离可以直接理解为求出两个点到根节点的权值之和,再减去2倍的最近公共祖先到根节点的距离 这是自己第一道 ...

  7. hdu 2586 lca在线算法(朴素算法)

    #include<stdio.h> #include<string.h>//用c/c++会爆栈,用g++ac #define inf 0x3fffffff #define N ...

  8. HDU 2586 How far away ? (LCA)

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

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

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

随机推荐

  1. iframe 标签属性解读

    iframe 元素会创建包含另外一个文档的内联框架(即行内框架)

  2. C# 实现连连看功能

    本文是利用C#实现连连看的小例子,以供学习分享使用.如有不足之处,还望指正. 思路: 初始化布局(横竖十行十列,共100个单元格,每一个格一个按钮,背景图为水果图片,随机生成) . 初始化对应棋盘(用 ...

  3. Android 9.0新特性

    1.全面屏支持,Android P加入了对刘海屏的支持,谷歌称之为凹口屏幕(display with a cutout).借助最新的提供的DisplayCutout类,开发者可以找到非功能区域的位置和 ...

  4. View体系第一篇:基础

    View体系的学习内容为学习刘望舒先生博客总结的内容,大家可到他的博客看到更详细的内容. 一.view之间的继承关系 Viewground用来包裹其他view.在平常的使用中,我们不会直接用到View ...

  5. Java:Hibernate报错记录:Error executing DDL via JDBC Statement

    想着写一篇hibernate的博文,于是准备从头开始,从官网下了最新的稳定版本来做讲述. 结果利用hibernate自动建表的时候发生下面这个问题. 我很纳闷,之前用低版本一点的没有发生这个问题啊. ...

  6. LeetCode题解之 Assign Cookies

    1.题目描述 2.问题分析 使用贪心算法. 3 代码 class Solution { public: int findContentChildren(vector<int>& g ...

  7. pjsip 播放音视频

    http://blog.csdn.net/leixiaohua1020/article/details/40246783 onCallMediaState回调里,解码方向,获取ci.media[i]. ...

  8. MyBatis笔记----报错Exception in thread "main" org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.ij34.model.UserMapper.selectUser

    信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@41cf53f9: startup ...

  9. 【MM系列】SAP的库存管理

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP的库存管理   前言部分 库存 ...

  10. C# Modbus协议中读取浮点数的操作方法

    输入参数P1,P2代表PLC中浮点数储存的两个寄存器获取的数据 public static float GetFloat(ushort P1, ushort P2) { int intSign, in ...