给一颗树,1为根,要求遍历树上所有点,给出叶子结点的访问顺序,限制每条边至多访问两次。
首先这是一棵树,那么两点之间的路线是确定的,所以我第一遍dfs预处理出从根节点到每个叶子的路径保存,以便后面输出。
那么就按照题目要求输出叶子结点的顺序依次输出,然后从一个叶子到下一个叶子的时候,从他们的最近公共祖先转折,所以我还预处理了相邻两个叶子结点的LCA。
#include...
分类:
其他好文 时间:
2014-08-15 14:37:08
阅读次数:
220
最近公共祖先(Least Common Ancestor)的两种解决方式,在线RMQ算法和离线Tarjan算法,并且整理成为模板。...
分类:
其他好文 时间:
2014-08-14 01:33:07
阅读次数:
374
#include"stdio.h"
#include"string.h"
#include"vector"
using namespace std;
#define N 11000
const int inf=1<<20;
vectorg[N];
int s,t,n;
int f[N],pre[N],ans[N];
bool vis[N];
int findset(int x)
{
if(...
分类:
其他好文 时间:
2014-08-13 22:30:17
阅读次数:
252
汉诺塔问题:P141用两个stack设计一个队列 p142 结合上题,队列实现max操作,要求尽量提高效率。(编程之美)找出二叉树中指定节点的下一个节点(中序后继),假定每个节点有父指针。p154二叉树某两个节点的公共祖先。p155判断T2是否是T1的子树。p159打印二叉树节点数值总和等于某个给....
分类:
其他好文 时间:
2014-08-12 00:13:23
阅读次数:
346
还是LCA-tarjan算法,跟POJ 1330做法基本类似,只是这个题目要求输出两个点的最短距离,其实利用LCA的性质,就是 两个点分别到最近公共祖先的距离之和一开始本来想用并查集把路径长度给找出来,但是不太好处理,原因是我刚好找到的这个点还没有加入到并查集中,(因为还没回溯上去),如果马上就合并...
分类:
其他好文 时间:
2014-08-10 18:06:30
阅读次数:
274
题意:求两个点的最近公共祖先。
1A#include
#include
#include
#include
#define maxn 100010
using namespace std;
int fa[maxn],lev[maxn],pre[maxn],c1,c2;
vector son[maxn];
bool dfs(int rt,int obj)
{
for(int i...
分类:
其他好文 时间:
2014-08-10 15:42:40
阅读次数:
261
题意要求一棵树上,两个点的最近公共祖先 即LCA现学了一下LCA-Tarjan算法,还挺好理解的,这是个离线的算法,先把询问存贮起来,在一遍dfs过程中,找到了对应的询问点,即可输出原理用了并查集和dfs染色,先dfs到底层开始往上回溯,边并查集合并 一边染色,这样只要询问的两个点均被染色了,就可以...
分类:
其他好文 时间:
2014-08-10 15:39:20
阅读次数:
215
基本概念LCA:树上的最近公共祖先,对于有根树T的两个结点u、v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u、v的祖先且x的深度尽可能大。RMQ:区间最小值查询问题。对于长度为n的数列A,回答若干询问RMQ(A,i,j),返回数列A中下标在[i,j]里的最小值下标。朴素LCA算法求出...
分类:
其他好文 时间:
2014-08-08 17:36:16
阅读次数:
226
先给个LCA模板HDU 1330(LCA模板)#include #include #define N 40005struct Edge{ int x,y,d,ne;};Edge e[N*2],e2[N*2];int be[N],be2[N],all,all2,n,m;bool vis[N];i...
分类:
其他好文 时间:
2014-08-06 21:57:33
阅读次数:
335
线性时间复杂度和 O(1)空间复杂度求二叉树中两个节点的最低公共祖先节点。...
分类:
其他好文 时间:
2014-08-03 15:21:24
阅读次数:
187