dfs序是指你用dfs遍历一棵树时,每个节点会按照遍历到的先后顺序得到一个序号。然后你用这些序号,可以把整个遍历过程表示出来。

如上图所示,则整个遍历过程为1 2 3 2 4 5 4 6 4 2 1 7 8 7 1

反正按照实现目的不同,dfs序会长得不太一样,比如说为了实现LCA就需要上面形式的dfs序。

用vs[]来保存整个遍历过程。

id[i]用来保存i节点的序号第一次出现在vs[]中时的下标。

这样当询问u,v点的LCA是谁是,你只要找到在vs[id[u]<= i <= id[v]]中最小值即可,那个最小值所对应的节点就是u,v的LCA

而这个过程你可以用RMQ进行预处理,然后O(1)就可以得到。(你应该知道vs[]的总长度为n*2-1)

 #include<bits/stdc++.h>
using namespace std;
const int M = 1e5 + ;
vector<int> g[M] ;
int n ; vector<int> vs ;//dfs order
int tot ;
int orm[M] ;
int id[M] ;
int dep[M] ; int d[M][] ;//RMQ
void dfs (int o , int u ,int DEP) {
int tmp = tot ++ ;
dep[u] = DEP ;
id[u] = vs.size () ;
orm[tmp] = u ;
vs.push_back (tmp) ; for (int i = ; i < g[u].size () ; i ++) {
int v = g[u][i] ;
if (v == o) continue ;
dfs (u , v , DEP + ) ;
}
int len = vs.size () ;
if (vs[len-] == tmp) vs.push_back (vs[id[o]]) ;
else vs.push_back (tmp) ;
} void init_RMQ () {
for (int i = ; i < *n- ; i ++) d[i][] = vs[i] ;
for (int j = ; ( << j) <= n ; j ++) {
for (int i = ; i + ( << j) <= n ; i ++) {
d[i][j] = min (d[i][j-] , d[i+(<<(j-))][j-]) ;
}
}
} int RMQ (int l , int r) {
printf ("l = %d , r = %d\n" , l , r ) ;
int k = ;
while ( (<<(k+)) <= r - l + ) k ++ ;
int tmp = min (d[l][k] , d[+r-(<<k)][k]) ;
return orm[tmp] ;
}
void Print () {
for (int i = ; i < *n- ; i ++) printf ("%3d " , i ) ; puts ("") ;
puts ("dfs order:") ;
for (int i = ; i < *n- ; i ++) printf ("%3d " , vs[i]) ; puts ("") ;
puts ("deep:") ;
for (int i = ; i < n ; i ++) printf ("%3d " , dep[i]) ; puts ("") ;
puts ("id :") ;
for (int i = ; i < n ; i ++) printf ("%3d " , id[i]) ; puts ("") ;
} void LCA () {
dfs (,,) ;
init_RMQ () ;
Print () ;
} int main () {
cin >> n ;
for (int i = ; i < n - ; i ++) {
int u , v ;
cin >> u >> v ;
g[u].push_back (v) ;
g[v].push_back (u) ;
}
LCA () ;
int Q ;
cin >> Q ;
while (Q --) {
int u , v ;
cin >> u >> v ;
if (id[u] > id[v]) swap (u , v ) ;
int ans = RMQ (id[u] , id[v]) ;
printf ("The %d and %d the lastest ans is %d , and they are away from %d\n" , u , v , ans , dep[u]+dep[v]-*dep[ans]) ;
}
return ;
}

测试数据:

8
0 1
0 2
1 3
1 4
2 5
4 6
4 7
3
0 4
3 4
6 2

3次询问的答案你画一下即可。hhhhhh(以0号节点为根)

dfs序 + RMQ = LCA的更多相关文章

  1. dfs序+RMQ求LCA详解

    首先安利自己倍增求LCA的博客,前置(算不上)知识在此. LCA有3种求法:倍增求lca(上面qwq),树链剖分求lca(什么时候会了树链剖分再说.),还有,标题. 是的你也来和我一起学习这个了qwq ...

  2. bzoj 2819 Nim(BIT,dfs序,LCA)

    2819: Nim Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1596  Solved: 597[Submit][Status][Discuss] ...

  3. P3703 [SDOI2017]树点涂色 LCT维护颜色+线段树维护dfs序+倍增LCA

    \(\color{#0066ff}{ 题目描述 }\) Bob有一棵\(n\)个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是:这条路径上的点 ...

  4. D - Project Presentation(DFS序+倍增LCA)

    You are given a tree that represents a hierarchy in a company, where the parent of node u is their d ...

  5. luogu3320 寻宝游戏 (dfs序+倍增lca+set)

    一定是从随便某个点开始,然后按着dfs序的顺序跑一圈是最好的 所以说,新加一个点x,就减少了dis(pre,next),增加了dis(pre,x),dis(x,nxt) 删掉一个点同理 这个可以用se ...

  6. BZOJ 2819: Nim( nim + DFS序 + 树状数组 + LCA )

    虽然vfleaking好像想卡DFS...但我还是用DFS过了... 路径上的石堆异或和=0就是必败, 否则就是必胜(nim游戏). 这样就变成一个经典问题了, 用DFS序+BIT+LCA就可以在O( ...

  7. 蓝皮书:异象石 【dfs序+lca】

    题目详见蓝皮书[算法竞赛:进阶指南]. 题目大意: 就是给你一颗树,然后我们要在上面进行三种操作:  1.标记某个点  或者  2.撤销某个点的标记  以及   3.询问标记点在树上连通所需的最短总边 ...

  8. 【BZOJ】1146: [CTSC2008]网络管理Network(树链剖分+线段树套平衡树+二分 / dfs序+树状数组+主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1146 第一种做法(时间太感人): 第二种做法(rank5,好开心) ================ ...

  9. lca 欧拉序+rmq(st) 欧拉序+rmq(线段树) 离线dfs 倍增

    https://www.luogu.org/problemnew/show/P3379 1.欧拉序+rmq(st) /* 在这里,对于一个数,选择最左边的 选择任意一个都可以,[left_index, ...

随机推荐

  1. Centos提示-bash: make: command not found的解决办法

    一般出现这个-bash: make: command not found提示,是因为安装系统的时候使用的是最小化mini安装,系统没有安装make.vim等常用命令,直接yum安装下即可: yum - ...

  2. java语言:Linux与JVM的内存关系分

    在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用大约800m.从表面上,物理内存应该 ...

  3. w3m浏览器 for Linux

    w3m是个开放源代码的文字式网页浏览器. w3m支持表格.框架.SSL连线.颜色. 如果是在适当的terminal(内核支持framebuffer)上,甚至还能显示图片. 这个软件通常尽量呈现出网页本 ...

  4. DockerProblem

    if you try to run the daemon manually: sudo /usr/bin/docker daemon And the error is: "FATA[0000 ...

  5. BZOJ3557: [Ctsc2014]随机数

    orz神犇们 clj(pw CCfCtsC2014) zyh cjj pyx vfk 吐槽一句对拍的时候发现这几份代码输出不一样. 每个数看成模2意义下的多项式: \[M_k\equiv x^kM_0 ...

  6. B2B电子商务网站技术框架

    一 设计原则 电子商务平台总体结构的设计应从体系.功能.信息.过程等各个方面保证整个电子商务平台总体目标的实现,以提高市场竞争能力.总体结构的设计应考虑以下设计原则: 快速响应原则:商机稍纵即逝,网站 ...

  7. C#MVC路由配置 之 动态请求伪装静态Json来欺骗CND

    public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.Ignore ...

  8. C#------DateTime自定义格式

    var text = Convert.ToString(DateTime.Now.ToString("yyyy/MM/dd"));

  9. Java 创建文件夹和文件

    String path="D://my"; File folder=new File(path); if(!folder.exists() && !folder.i ...

  10. docker快速启动脚本

    #!/bin/sh PID=$(docker inspect --format "{{.State.Pid}}" $1) nsenter -t $PID -u -i -n -p n ...