LCA-倍增法(写给自己看)】的更多相关文章

一.前人种树 博客:最近公共祖先 LCA 倍增法 博客:浅谈倍增法求LCA 二.沙场练兵 题目:POJ 1330 Nearest Common Ancestors 代码: const int MAXN = 10010; const int DEG = 20; struct Edge { int to,next; }edge[MAXN*2]; int head[MAXN],tot; void addedge(int u,int v) { edge[tot].to = v; edge[tot].ne…
1.输入树中的节点数N,输入树中的N-1条边.最后输入2个点,输出它们的最近公共祖先. 2.裸的最近公共祖先. 3. dfs+ST在线算法: /* LCA(POJ 1330) 在线算法 DFS+ST */ #include<iostream> #include<stdio.h> #include<string.h> using namespace std; ; *MAXN];//rmq数组,就是欧拉序列对应的深度序列 struct ST{ *MAXN]; *MAXN][…
题目大意:给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 整体步骤:1.使两个点深度相同:2.使两个点相同. 这两个步骤都可用倍增法进行优化.定义每个节点的Elder[i]为该节点的2^k(或者说是二进制中的1,10,100,1000...)辈祖先.求它时要利用性质:cur->Elder[i]==cur->Elder[i-1]->Elder[i-1].具体步骤看代码. #include <cstdio> #include <cstring> #inclu…
LCA-倍增法 题目又做不下去来写题解了 算法思想 类似于ST表的思想维护dp[i][j]:节点i向上跳2^j高度的的节点 转移方程 \(dp[i][j]=dp[dp[i][j-1]][j-1]\)注意理解依赖关系,dp[i][j]状态的确定需要dp[x][j-1] 所以在每次需要先得到[j-1]的所有状态才能推出[j],即如果写成双重循环j的循环应该在外层 dfs中完成初始化\(dp[i][0]\),同时可完成dp[i][j]的更新 用途 多次查询两点间路径(维护树上前缀和即可) 裸题:最近公…
倍增法加了边的权值,bfs的时候顺便把每个点深度求出来即可 #include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; #define maxn 40005 #define DEG 20 struct Edge{ int to,next,w; }edge[maxn*]; int head[maxn],tot; void addedge(i…
倍增法模板题 #include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; #define maxn 1000 #define DEG 20 struct Edge{ int to,next; }edge[maxn*maxn*]; int head[maxn],tot; void addedge(int u,int v){ edge[tot…
[简介] 解决LCA问题的倍增法是一种基于倍增思想的在线算法. [原理] 原理和同样是使用倍增思想的RMQ-ST 算法类似,比较简单,想清楚后很容易实现. 对于每个节点u , ancestors[u][k] 表示 u 的第2k个祖先是谁.很容易就想到递推式: ancestors[j][i] = ancestors[ancestors[j][i - 1]][i - 1];  根据二进制原理,理论上 u 的所有祖先都可以根据ancestors数组多次跳转得到,这样就间接地记录了每个节点的祖先信息. …
LCA(Least Common Ancestors) 即最近公共祖先,是指在有根树中,找出某两个结点u和v最近的公共祖先. 常见解法一般有三种 这里讲解一种在线算法-倍增 首先我们定义fa[u][j]表示结点u的第2^j祖先 那么要怎么求出全部的fa数组呢 不难发现fa[u][0]就是u的父亲结点 这些父亲结点我们可以直接初始化 对于其他结点则有 fa[u][j]=fa[ fa[u][j-1] ] [j-1] 什么意思呢 u的第2^(j-1)祖先的第2^(j-1)祖先 就是u的第2^j祖先(有…
You are given a tree (an undirected acyclic connected graph) with N nodes, and edges numbered 1, 2, 3...N-1. Each edge has an integer value assigned to it, representing its length. We will ask you to perfrom some instructions of the following form: D…
链接:http://poj.org/problem?id=1330 题意:q次询问求两个点u,v的LCA 思路:LCA模板题,首先找一下树的根,然后dfs预处理求LCA(u,v) AC代码: #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<set> #include<string> #include<vector&…