LCA 在线倍增法 求最近公共祖先
第一步:建树 这个就不说了
第二部:分为两步 分别是深度预处理和祖先DP预处理
DP预处理:
- int i,j;
- for(j=;(<<j)<n;j++)
- for(int i=;i<n;++i)
- if(fa[i][j]=-)
- fa[i][j]=fa[fa[i][j-]][j-];/*DP处理出i的2^j祖先是谁*/
深度预处理:
- void dfs(int now,int from,int deepth)
- {
- deep[now]=deepth;
- for(int i=head[now];i;i=e[i].pre)
- if(e[i].v!=from)
- dfs(e[i].v,now,deepth+);
- }
第三部分:LCA核心
- int LCA(int a,int b)// 求a、b的最近公共祖先
- {
- int i,j;
- if(deep[a]<deep[b]) swap(a,b); // 保证a的深度比b大这样便于操作
- for(i=;(<<i)<=deep[a];++i);// (1<<i) 等同于2的i次方
- i--;
- for(j=i;j>=;j--)
- if((deep[a]-(<<j))>=deep[b])// 让a节点往上蹦 直到a、b晚上一蹦就重合
- a=fa[a][j];
- if(a==b)return a;// 如果a的一个祖先恰好是b
- for(j=i;j>=;j--)
- if(fa[a][j]!=-&&fa[a][j]!=fa[b][j])// 没有越界并且祖先不同 那么就让a,b同时往上蹦
- {
- a=fa[a][j];
- b=fa[b][j];
- }
- return fa[a][];
- }
默写的代码:
- void DP {
- int i,j;
- for(int j=; (<<j)<n; j++) {
- for(int i=; i<n; i++)
- if(fa[i][j]=-)
- fa[i][j]=fa[fa[i][j-]][j-];
- }
- }
- void dfs(int now,int deepth,int from) {
- deep[now]=deepth;
- for(int i=head[now]; i; i=e[i].next) {
- if(e[i].v!=from) {
- dfs(e[i].v,deepth+,now);
- }
- }
- }
- int LCA(int a,int b) {
- int i,j;
- if(deep[a]<deep[b]) swap(a,b);
- for(i=; (<<i)<=deep[a]; i++);
- i--;
- for(j=i; j>=; j--) {
- if(deep[a]-(<<j)>=deep[b])
- a=fa[a][j];
- }
- if(a==b) return a;
- for(j=i; j>=; j--) {
- if(fa[a][j]!=-&&fa[a][j]!=fa[b][j]) {
- a=fa[a][j];
- b=fa[b][j];
- }
- }
- return fa[a][];
- }
LCA 在线倍增法 求最近公共祖先的更多相关文章
- 用“倍增法”求最近公共祖先(LCA)
1.最近公共祖先:对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.的祖先且x的深度尽可能大. 2.朴素算法:记录下每个节点的父亲,使节点u,v一步一步地向上找 ...
- 在线倍增法求LCA专题
1.cojs 186. [USACO Oct08] 牧场旅行 ★★ 输入文件:pwalk.in 输出文件:pwalk.out 简单对比时间限制:1 s 内存限制:128 MB n个被自 ...
- 倍增法求lca(最近公共祖先)
倍增法求lca(最近公共祖先) 基本上每篇博客都会有参考文章,一是弥补不足,二是这本身也是我学习过程中找到的觉得好的资料 思路: 大致上算法的思路是这样发展来的. 想到求两个结点的最小公共祖先,我们可 ...
- 倍增法求LCA
倍增法求LCA LCA(Least Common Ancestors)的意思是最近公共祖先,即在一棵树中,找出两节点最近的公共祖先. 倍增法是通过一个数组来实现直接找到一个节点的某个祖先,这样我们就可 ...
- 树上倍增法求LCA
我们找的是任意两个结点的最近公共祖先, 那么我们可以考虑这么两种种情况: 1.两结点的深度相同. 2.两结点深度不同. 第一步都要转化为情况1,这种可处理的情况. 先不考虑其他, 我们思考这么一个问题 ...
- 【LCA求最近公共祖先+vector构图】Distance Queries
Distance Queries 时间限制: 1 Sec 内存限制: 128 MB 题目描述 约翰的奶牛们拒绝跑他的马拉松,因为她们悠闲的生活不能承受他选择的长长的赛道.因此他决心找一条更合理的赛道 ...
- HDU 2586 倍增法求lca
How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- POJ 1986 Distance Queries (Tarjan算法求最近公共祖先)
题目链接 Description Farmer John's cows refused to run in his marathon since he chose a path much too lo ...
- RMQ(倍增法求ST)
解决什么问题:区间查询最值 倍增思想:每次得出结果的范围呈2的幂次增长,有人说相当于二分,目前我觉得相当于线段树的查找. 具体理解看代码: /*倍增法求ST*/ #include<math.h& ...
随机推荐
- 外文翻译 《How we decide》多巴胺的预言 第三节
这是第二章的最后一节. 书的导言 本章第一节 本章第二节 本节阅读感言:自我批评是自我提升的妙方. 多巴胺是我们感情的源泉.多巴胺相关的神经系统在不断的记录着我们主观意识没有注意到的一个个模式,将它们 ...
- flask搭建
1.定义路由app.py from flask import Flask, request from flask import Blueprint app = Flask(__name__) test ...
- canvas基础绘制-绚丽时钟
效果图: 与canvas基础绘制-绚丽倒计时的代码差异: // var endTime = new Date();//const声明变量,不可修改,必须声明时赋值: // endTime.setTim ...
- laravel学习笔记(二)
路由 HTTP方法:支持http1.1中所有类型传参方式,get,post,put,delete,options,patch Route::get($url,$callback); 路由参数: Rou ...
- https为数据传输保驾护航
为什么要使用https 谷歌官网已宣布,今年7月起,Chrome浏览器的地址栏将把所有HTTP标示为不安全网站. 在客户端与服务器数据传输过程中,http协议传输是不安全的,一般情况下,http协议的 ...
- 跑RFCN
按照这个来http://blog.csdn.net/sinat_30071459/article/details/53202977
- Hibernate-02 HQL实用技术
学习任务 Query接口的使用 HQL基本用法 动态参数绑定查询 HQL的使用 Hibernate支持三种查询方式:HQL查询.Criateria查询.Native SQL查询. HQL是Hibern ...
- python入门-PyCharm中目录directory与包package的区别及相关import详解
一.概念介绍 在介绍目录directory与包package的区别之前,先理解一个概念---模块 模块的定义:本质就是以.py结尾的python文件,模块的目的是为了其他程序进行引用. 目录(Dict ...
- 5. COLUMNS
5. COLUMNS 表COLUMNS提供表中列的信息. INFORMATION_SCHEMA Name SHOW Name Remarks TABLE_CATALOG TABLE_SCHEMA TA ...
- 移动web touch事件
参考:http://www.cnblogs.com/dojo-lzz/p/5452575.html wap中的原生touch 事件,touchstart.touchmove.touchend.touc ...