测试数据

1 10 1
1 2 2
1 4 4
2 3 3
2 5 6
3 7 1
3 8 2
5 6 3
6 9 2
4 10 4
9 10

终于造了什么事树上倍增了下午考pat。。。哭卿卿

代码理解来自 自己又加了备注。。。。 建议模拟一下

https://blog.csdn.net/a601025382s/article/details/10615039

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<bits/stdc++.h>
using namespace std;
const int maxn=40004;
struct node{int to,w;node(int a=0,int b = 0){to=a;w=b;}
};
vector<node>e[maxn];
int f[maxn],dis[maxn],deep[maxn],p[maxn][20],n;
void dfs(int u,int pre,int t)
{int i,num;deep[u]=t;//深度f[u]=pre;//父节点num=e[u].size();for(i=0;i<num;i++){int v=e[u][i].to;if(v!=pre){dis[v]=dis[u]+e[u][i].w;//距离跟的距离dfs(v,u,t+1);}}
}
void init()
{//p[i][j]表示i结点的第2^j祖先int i, j;for(j = 1;(1 << j) <= n; j++)for(i = 1;i <= n; i++)p[i][j] = -1; //都初始化为-1for(i = 1;i <= n; i++)p[i][0] = f[i];for(j = 1;(1<<j) <= n;j ++){for(i = 1;i <= n; i++){if(p[i][j-1] != -1)p[i][j] = p[p[i][j-1]][j-1];//i的第2^j祖先就是i的第2^(j-1)祖先的第2^(j-1)祖先}}
}
int lca(int a,int b)//最近公共祖先
{int i,j;if(deep[a] < deep[b])swap(a,b);for(i = 0;(1 << i) <= deep[a]; i++);i--;//其实小于也行等于也好 //使a,b两点的深度相同for(j = i;j >= 0;j--){if(deep[a]-(1<<j)>=deep[b]){a = p[a][j];}} //找到与b同层的或者说 b没有同层的 那么就找他的上一层 不用担心p[a][j]是否等于-1 肯定有 if(a == b)return a;//倍增法,每次向上进深度2^j,找到最近公共祖先的子结点for(j = i;j >= 0; j--){if(p[a][j] != -1 && p[a][j] != p[b][j]){a = p[a][j];b = p[b][j];}}/*如果说都是相等的话 那么说明a b在两个子树的左右子树下面 所以直接返回一个子树的根节点就行  如果说是有不相等的话 那么就两个节点各自更新成他们的p[a][j] 和 p[b][j] */ return f[a]; }
int main()
{int m,i,a,b,c,ans;scanf("%d%d",&n,&m);for(i=1;i<=n;i++)e[i].clear();for(i=1;i<n;i++){scanf("%d%d%d",&a,&b,&c);e[a].push_back(node(b,c));e[b].push_back(node(a,c));}dis[1]=0;dfs(1,-1,0);//找到各点的深度和各点的父节点以及距离根的距离
//  cout<<"dis"<<endl;
//  for(int i = 0 ; i <= n ; i ++)
//      printf("%d%c",dis[i]," \n"[i==n]);
//  cout<<"deep"<<endl;
//  for(int i = 0 ; i <= n ; i ++)
//      printf("%d%c",deep[i]," \n"[i==n]);
//  cout<<"f"<<endl;
//  for(int i = 0 ; i <= n ; i ++)
//      printf("%d%c",f[i]," \n"[i==n]);init();     //初始各个点的2^j祖先是谁    for(i=0;i<m;i++){scanf("%d%d",&a,&b);cout<<lca(a,b)<<endl;}return 0;
}
/*最近公共祖先lca,在线算法/倍增法,模板题。套别人模板自己敲了遍,现在还要回顾下邻接表,哎。。用vector,发现爆栈了,汗一个。。用#pragma comment(linker, "/STACK:1024000000,1024000000") 开个把栈开大点吧。。hdu可以,别的地方就不清楚了
*/
/*
1 10 7
1 2 2
1 4 4
2 3 3
2 5 6
3 7 1
3 8 2
5 6 3
6 9 2
4 10 4
*/

LCA算法 在线树上倍增模板相关推荐

  1. 对LCA、树上倍增、树链剖分(重链剖分长链剖分)和LCT(Link-Cut Tree)的学习

    LCA what is LCA & what can LCA do LCA(Lowest Common Ancestors),即最近公共祖先 在一棵树上,两个节点的深度最浅的公共祖先就是 L ...

  2. LCA算法以及原理详解

    LCA-最近公共祖先   LCA(Least Common Ancestors),即最近公共祖先,这种描述是基于树结构的,也即我们通通常只在树结构中考虑祖先问题.树实际上就是图论中的有向无环图,而要研 ...

  3. 关于树论【LCA树上倍增算法】

    补了一发LCA,表示这东西表面上好像简单,但是细节真挺多. 我学的是树上倍增,倍增思想很有趣~~(爸爸的爸爸叫奶奶.偶不,爷爷)有一个跟st表非常类似的东西,f[i][j]表示j的第2^i的祖先,就是 ...

  4. 树上倍增求LCA及例题

    先瞎扯几句 树上倍增的经典应用是求两个节点的LCA 当然它的作用不仅限于求LCA,还可以维护节点的很多信息 求LCA的方法除了倍增之外,还有树链剖分.离线tarjan ,这两种日后再讲(众人:其实是你 ...

  5. LCA 最近公共祖先(RMQ、树上倍增、Tarjan),树上两点距离,线段重合长度

    对于LCA的一些理解 RMQ dfs处理树 对于一个树形结构,可以用dfs将一颗树转化成数组,数组中记录每个点的标号,这样数组就按照dfs的顺序把树存了下来 确定祖先的范围 对于询问的节点X和Y, X ...

  6. POJ - 1330 Nearest Common Ancestors(树上倍增/树链剖分求LCA)

    题目链接:点击查看 题目大意:给出一棵有根树,我们需要求出两个点的lca 题目分析:因为题目说了是有根树,所以我们在建图的时候直接建有向图就好了,并且记录一下每个点的入度,建完图后找一下入度为0的点, ...

  7. 洛谷 P4281 [AHOI2008]紧急集合 / 聚会(树上倍增 LCA)

    [AHOI2008]紧急集合 / 聚会 题目描述 欢乐岛上有个非常好玩的游戏,叫做"紧急集合".在岛上分散有 n n n 个等待点,有 n − 1 n-1 n−1 条道路连接着它们 ...

  8. 树上倍增法求最近公共祖先LCA

    LCA,最近公共祖先,这个东西有很多作用,因此,如何高效求出LCA就成了一个热点的讨论话题. 下面所有的讨论都以图中这棵树为例子. 先来了解下什么是倍增吧,倍增其实就是二分的逆向,二分是逐渐缩小范围, ...

  9. LCA 朴素算法+树差分倍增+Tarjan算法 三种算法实现c++代码实现

    哔哩哔哩up视频:https://www.bilibili.com/video/BV1nE411L7rz?t=379 转载:http 文章目录 树差分 & 倍增LCA Tarjan 朴素算法 ...

  10. LCA(树上倍增 || rmqlca||)

    背景&&描述 给出一棵根节点为1的树,每次询问两点之间的最近公共祖先. 输入格式 第一行一个整数n表示树的节点个数 第二行n-1个数,第i个数表示点(i+1)的父亲是哪个点.保证第i个 ...

最新文章

  1. VMware中创建Ubuntu16.0.4虚拟桥连方式无法上网
  2. matlab学习第一天
  3. 区块链的技术——账本是去中心化的分布式存储,加密+校验(哈希二叉树)+多数选举来防止篡改...
  4. springmvc常用5种注解_砂石骨料线常用的5种破碎设备、5种筛分和制砂设备特点比较...
  5. opencv学习笔记7:图像加法与图像融合
  6. asp.net 2.0 设置表格高度为100%.
  7. HDU 4028 The time of a day STL 模拟题
  8. 第49课 大大大(纯小数变整数) 《小学生C++趣味编程》
  9. arduino char*转string_面试官:String长度有限制吗?是多少?还好我看过
  10. 认识Java中的异常、异常的基本用法
  11. sharepoint 特别信息 --- 自个乐去吧~~
  12. Android FrameWork——ActivityManager框架
  13. Jenkins不同job之间传递参数
  14. 到底什么方法 训练1000个样本,就能完成400万条评论分类!
  15. 参数估计:文本分析的参数估计方法
  16. Oracle linux系统安装oracle11g
  17. 为什么Dell官方声卡驱动安装不上的原因分析与解决?
  18. 软考常用计算公式及理解
  19. cupload怎么保存图片_微信透明头像怎么弄 专用透明头像图片更换设置教程
  20. 大数据工程师(开发)面试系列(7)

热门文章

  1. 杂谈:Molehill API 的体现
  2. 深入解析Invoke and BeginInvoke, 同步与异步解析
  3. 不要迷失在技术的海洋中(转)
  4. stack(栈)数据结构详解
  5. 大数据项目之dmp用户画像
  6. 使用数据库引擎优化顾问添加建议索引
  7. SpringCloud学习之Hystrix
  8. mysql做主从分离后插入更新过慢
  9. 环境配置就是安装软件,修改软件的配置文件,安装软件就是文件的复制,与新增--linux下一切皆文件...
  10. 学习Unix下C编程的实例