摘要: 关于LCA和RMQ问题一、最近公共祖先(Least Common Ancestors)对于有根树T的两个结点u、v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u、v的祖先且x的深度尽可能大。另一种理解方式是把T理解为一个无向无环图,而LCA(T,u,v)即u到v的最短路上深度最小的点。这里给出一个LCA的例子:例一对于T=<V,E>V={1,2,3,4,5}E={(1,2),(1,3),(3,4),(3,5)}则有:LCA(T,5,2)=1LCA(T,3,4)=3LCA(T,4,5)=3 二、RMQ问题(Range Minimum Query)RMQ问题是指:对于长度 阅读全文
posted @ 2012-08-22 19:58 一把刷子 阅读(270) 评论(0) 推荐(0) 编辑
摘要: 网上查了半天不知所云,网上说的太多,俺只是要知道所需要的就可以了。写了个程序试了一下,其实就是这个东西可以根据你所需要的类型就行匹配。其实就是模板比如求最小值,要int,double,char,那么你就 要写三个函数1 int sum(int, int);2 3 float sum(float, float);4 5 double sum(double, double);6 7 但是有了templae<typename T>你就只需要写一个函数。详见代码: 1 #include<iostream> 2 #include<vector> 3 #include& 阅读全文
posted @ 2012-08-22 17:11 一把刷子 阅读(14039) 评论(0) 推荐(3) 编辑
摘要: http://poj.org/problem?id=1330这个是tarjian离线的版本:对于一个父亲的所有孩子。我们都去递归Lca。如果当前点是要询问的那个两个点中的一个而且另外一个已经访问过了。就输出。方法一:Tarjan离线算法 在学习离线算法的时候先需要先巩固一下深度搜索,并查集 Tarjan离线算法是基于深度优先搜索的,我们从根开始向下搜索,搜到一个节点的时候首先判断该节点所有子节点是否访问过,如果都已经访问过,则判断该节点是否询问点里面的其中一个,如果是,则判断跟它相对应的那个点是否已经访问过,如果访问过,则他们的最近公共祖先便是已经访问过的那个节点的当前节点,如果另外一个节点没 阅读全文
posted @ 2012-08-22 15:54 一把刷子 阅读(212) 评论(0) 推荐(0) 编辑