caioj 1237: 【最近公共祖先】树上任意两点的距离 倍增ST

题目链接:http://caioj.cn/problem.php?id=1237

思路:

  • 针对询问次数多的时候,采取倍增求取LCA,同时跟新距离数组
  • 因为
  • \(2^{14} > 10000\)
  • 所以所以表示祖先的数组dp[][]第二维取到14即可

代码:

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <math.h>
  6. using namespace std;
  7. const int maxn = 10005;
  8. const int maxm = 20005;
  9. struct node {
  10. int to,next,w;
  11. }edges[maxm];
  12. int head[maxn],cnt,dp[maxn][15],dep[maxn],dist[maxn];
  13. void addedge(int u, int v, int w) {
  14. edges[cnt].to=v;
  15. edges[cnt].w=w;
  16. edges[cnt].next=head[u];
  17. head[u]=cnt++;
  18. }
  19. void dfs(int s, int x) {
  20. dep[s]=dep[x]+1;
  21. dp[s][0]=x;
  22. int t;
  23. for(int i=1;(1<<i)<=dep[s];++i)
  24. dp[s][i]=dp[dp[s][i-1]][i-1];
  25. for(int i=head[s];i!=-1;i=edges[i].next) {
  26. t=edges[i].to;
  27. if(t==x) continue;
  28. dist[t]=dist[s]+edges[i].w;
  29. dfs(t,s);
  30. }
  31. }
  32. int lca(int u, int v) {
  33. if(dep[v]>dep[u]) swap(u,v);
  34. for(int i=14;i>=0;--i) {
  35. if((1<<i)<=(dep[u]-dep[v])) {
  36. u=dp[u][i];
  37. }
  38. }
  39. if(u==v) return u;
  40. for(int i=14;i>=0;--i) {
  41. if((1<<i)<=dep[u]&&(dp[u][i]!=dp[v][i])) {
  42. u=dp[u][i];
  43. v=dp[v][i];
  44. }
  45. }
  46. return dp[u][0];
  47. }
  48. int slove(int u ,int v) {
  49. int z=lca(u,v);
  50. return dist[u]-2*dist[z]+dist[v];
  51. }
  52. void init() {
  53. cnt=0;
  54. memset(head,-1,sizeof(head));
  55. }
  56. int main() {
  57. int n,m,u,v,w;
  58. scanf("%d %d",&n,&m);
  59. init();
  60. for(int i=1;i<n;++i) {
  61. scanf("%d %d %d",&u,&v,&w);
  62. addedge(u,v,w);
  63. addedge(v,u,w);
  64. }
  65. dep[1]=0;//为了统一dfs的写法,实际dep[1]=1
  66. dp[1][0]=1;
  67. dfs(1,1);
  68. for(int i=1;i<=m;++i) {
  69. scanf("%d %d",&u,&v);
  70. printf("%d\n",slove(u,v));
  71. }
  72. return 0;
  73. }

caioj 1237: 【最近公共祖先】树上任意两点的距离 在线倍增ST的更多相关文章

  1. HDU 2376 树形dp|树上任意两点距离和的平均值

    原题:http://acm.hdu.edu.cn/showproblem.php?pid=2376 经典问题,求的是树上任意两点和的平均值. 这里我们不能枚举点,这样n^2的复杂度.我们可以枚举每一条 ...

  2. HDU 5723 Abandoned country(kruskal+dp树上任意两点距离和)

    Problem DescriptionAn abandoned country has n(n≤100000) villages which are numbered from 1 to n. Sin ...

  3. JAVA 计算地球上任意两点(经纬度)距离

    /** * 计算地球上任意两点(经纬度)距离 * * @param long1 * 第一点经度 * @param lat1 * 第一点纬度 * @param long2 * 第二点经度 * @para ...

  4. caioj 1236 最近公共祖先 树倍增算法模版 倍增

    [题目链接:http://caioj.cn/problem.php?id=1236][40eebe4d] 代码:(时间复杂度:nlogn) #include <iostream> #inc ...

  5. [luogu3379]最近公共祖先(树上倍增求LCA)

    题意:求最近公共祖先. 解题关键:三种方法,1.st表 2.倍增法 3.tarjan 此次使用倍增模板(最好采用第一种,第二种纯粹是习惯) #include<cstdio> #includ ...

  6. 洛谷P3379 【模板】最近公共祖先(LCA)(dfs序+倍增)

    P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...

  7. git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0

    // ConsoleApplication10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream& ...

  8. HDU2376Average distance(树形dp|树上任意两点距离和的平均值)

    思路: 引:如果暴力枚举两点再求距离是显然会超时的.转换一下思路,我们可以对每条边,求所有可能的路径经过此边的次数:设这条边两端的点数分别为A和B,那 么这条边被经过的次数就是A*B,它对总的距离和的 ...

  9. 【非原创】codeforces 1060E Sergey and Subway 【树上任意两点距离和】

    学习博客:戳这里 本人代码: 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 con ...

随机推荐

  1. yii2之依赖注入与依赖注入容器

    一.为什么需要依赖注入 首先我们先不管什么是依赖注入,先来分析一下没有使用依赖注入会有什么样的结果.假设我们有一个gmail邮件服务类GMail,然后有另一个类User,User类需要使用发邮件的功能 ...

  2. PHP常用配置

    Php配置文件:php.ini(使用‘;’表示注释) Php的配置项可以在配置文件中配置,也可以在脚本中使用ini_set()函数临时配置. 语言相关配置: 1. engine:设置PHP引擎是否可用 ...

  3. vi 编辑器笔记

    摘要: vi从安装到使用 vi从菜鸟到高手 0. vim - Vi IMproved, a programmers text editor 分为 VI和VIM,现在流行的发行版里面VI=VIM 是一个 ...

  4. 高性能 Lua 技巧(译)

    高性能 Lua 技巧(译) 来源 https://segmentfault.com/a/1190000004372649 此为 Lua Programming Gems 一书的第二章:Lua Perf ...

  5. sass学习--安装ruby

    1.下载ruby:https://rubyinstaller.org/downloads/ 2.安装完ruby之后,在开始菜单中,找到刚才我们安装的ruby,打开Start Command Promp ...

  6. Windows 配置 allure report 环境

    1:配置Java环境(运行allure 需要) 2:安装powershell 3:安装scoop方法 :运行 powershell 输入 : iex (new-object net.webclient ...

  7. Android开发之漫漫长途 Ⅰ——Android系统的创世之初以及Activity的生命周期

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>中的相关知识,再次表示该书 ...

  8. linux-rmdir

    linux-rmdir rmdir命令用于删除空目录,删除的目录的里面必须无任何东西,有点鸡肋的命令 从下面先建立了一个a文件夹. 命令: rmdir a,即可删除这个空目录,ls 就找不到这个文件夹 ...

  9. JQ图片文件上传之前预览功能

    1.先准备一个div onchange触发事件 <input  type="file" onchange="preview(this)" >< ...

  10. 【python】python的正则表达式 re

    ps:本文摘自互联网,觉得结构很好,讲的也很清晰.记下,备查. 延伸阅读:python的 内建函数 和 subprocess .此文是本系列的第三篇文章了,和之前一样,内容出自官方文档,但是会有自己的 ...