LCA 最近公共祖先 (模板)】的更多相关文章

Tarjan版本 /* gyt Live up to every day */ #pragma comment(linker,"/STACK:1024000000,1024000000") #include<cstdio> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<stack> #include&…
原理可以参考大神 LCA_Tarjan (离线) TarjanTarjan 算法求 LCA 的时间复杂度为 O(n+q) ,是一种离线算法,要用到并查集.(注:这里的复杂度其实应该不是 O(n+q) ,还需要考虑并查集操作的复杂度 ,但是由于在多数情况下,路径压缩并查集的单次操作复杂度可以看做 O(1),所以写成了 O(n+q).) #include<bits/stdc++.h> using namespace std; ; ]; struct Query{ int v, id; Query(…
vector模拟邻接表: #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<queue> #define eps 1e-8 #define memset(a,v) memset(a,v,sizeof(a)) using namespace std; typedef long long int L…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 #include<iostream> #include<cstdio> #include<cmath> #include<queue> #include<vector> #include<string.h> #include<cstring> #include<algorithm> #include<s…
概述 对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. 如图,3和5的最近公共祖先是1,5和2的最近公共祖先是4 在本篇中我们先介绍一下倍增算法 我们需要一个数组de[i]来表示每一个节点i的深度,用另一数组parent[i][j]来表示每一节点j向上走2的i次方是哪个节点 我们首先在初始化中算出每个点的深度和它的上一个点是什么(用parent[0][i]表示) 在此后我们进行倍增的处理:parent[1][j]=parent…
http://poj.org/problem?id=1330 #include<cstdio> #include<cstring> #include<algorithm> #define mt(a,b) memset(a,b,sizeof(a)) using namespace std; const int inf=0x3f3f3f3f; class LCA { ///最近公共祖先 build_o(n*logn) query_o(1) typedef int typec…
Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载) 转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合. 3.点连…
CodeVs.1036 商务旅行 ( LCA 最近公共祖先 ) 题意分析 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意两个城镇之间如果有直连道路,在他们之间行驶需要花费单位时间.该国公路网络发达,从首都出发能到达任意一个城镇,并且公路网络不会存在环. 你的任务是帮助该商人计算一下他的最短旅行时间. 输入文件中的第一行有一个整数N,1<=n<=30 000,为城镇的数目.下…
LCA近期公共祖先 该分析转之:http://kmplayer.iteye.com/blog/604518 1,并查集+dfs 对整个树进行深度优先遍历.并在遍历的过程中不断地把一些眼下可能查询到的而且结果同样的节点用并查集合并. 2,分类.使每一个结点都落到某个类中,到时候仅仅要运行集合查询,就能够知道结点的LCA了. 对于一个结点u.类别有: 以u为根的子树.除类一以外的以f(u)为根的子树.除前两类以外的以f(f(u))为根的子树.除前三类以外的以f(f(f(u)))为根的子树-- 类一的…
LCA 近期公共祖先 小结 以poj 1330为例.对LCA的3种经常使用的算法进行介绍,分别为 1. 离线tarjan 2. 基于倍增法的LCA 3. 基于RMQ的LCA 1. 离线tarjan /*poj 1330 Nearest Common Ancestors 题意: 给出一棵大小为n的树和一个询问(u,v), 问(u,v)的近期公共祖先. 限制: 2 <= n <= 10000 思路: 离线tarjan */ #include<iostream> #include<…