dfs序
时间:2019-12-02
本文章向大家介绍dfs序,主要包括dfs序使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
DFS序:
每个节点在dfs遍历中进出栈的时间序列
将树形结构转化为线性结构,用dfs遍历一遍这棵树,进入到x节点有一个in时间戳,递归退出时有一个out时间戳,
x节点的两个时间戳之间遍历到的点,就是根为x的子树的所有节点。
dfs序就是A-B-D-D-E-G-G-E-B-C-F-H-H-F-C-A
void dfs(int node,int parent){ NewIdx[NCnt] = node; InOut[NCnt] = 1; InIdx[node] = NCnt++; for(int next=Vertex[node];next;next=Edge[next].next){ int son = Edge[next].to; if ( son != parent ) dfs(son,node); } NewIdx[NCnt] = node; InOut[NCnt] = -1; OutIdx[node] = NCnt++; }
dfs序求lca
点u,v的LCA还满足 它是其中一个点的最近的一个祖先,满足u,v都在它的子树中。
判断一个点是否在另一个点的子树中,我们可以用dfs序来判断。
这是倍增的另一种判断方法:
void dfs(int p, int fa) { bz[p][0] = fa, in[p] = ++cnt; for (int i = 1; i < bzmax; i++) bz[p][i] = bz[bz[p][i - 1]][i - 1]; for (int i = g.h[p]; ~i; i = g[i].nx) { int e = g[i].ed; if (e == fa) continue; dfs(e, p); } out[p] = cnt; } int lca(int a, int b) { if (dep[a] > dep[b]) swap(a, b); if (in[a] <= in[b] && out[a] >= out[b]) return a; for (int i = bzmax - 1, nx; ~i; i--) { nx = bz[a][i]; if (!(in[nx] <= in[b] && out[nx] >= out[b])) a = nx; } return bz[a][0];
参考博客:https://www.cnblogs.com/kousak/p/9192094.html
原文地址:https://www.cnblogs.com/young-children/p/11973587.html
- jboss eap 6.2+ 版本中 加密datasource密码等敏感信息
- WordPress自定义栏目运用实例II:添加文章Meta标签(keywords /description)
- 《Deep Learning with Python》第一章 1.1 人工智能、机器学习和深度学习
- boost::function的用法
- rpc框架之 thrift 学习 1 - 安装 及 hello world
- WordPress自定义栏目运用实例Ⅰ:添加文章来源
- ZooKeeper 笔记(5) ACL(Access Control List)访问控制列表
- 算法:支持重复元素的二分查找
- .NET 异常处理的动作策略(Action Policy)
- 如何在mac本上安装android sdk
- Fityk-曲线拟合工具
- maven: 打包可运行的jar包(java application)及依赖项处理
- Effective java 第2版 - 笔记(01) 单例(Singleton)的枚举(enum)实现
- 恶心的0.5四舍五入问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法