dfs序
一、前置芝士
- dfs(废话)
二、定义
考虑dfs序并没有公认的定义,所以此处给出个人理解,仅供参考:
dfs序是每个节点出栈(入栈、出入栈)的时间序列
注意:DFS序 不等于 欧拉序(欧拉序回溯时要记录而dfs序不用)
三、标序方式
考虑先给出dfs后的一棵树(dfs树)
1.入栈顺序
即搜索到一个节点的顺序
2.出栈顺序
即退出一个节点的顺序
3.结合在一起
我们假设一个点 x x x, t i n x tin_x tinx表示点 x x x的入栈时间, t o u t x tout_x toutx表示点 x x x的出栈时间
由上图我们可以得到一个性质:
- 对于点
u
,
v
u,v
u,v,
u
u
u为
v
v
v的父节点,当且仅当
t
i
n
u
<
t
i
n
v
且
t
o
u
t
v
<
t
o
u
t
u
tin_u < tin_v 且 tout_v < tout_u
tinu<tinv且toutv<toutu。这个性质可以
O
(
1
)
O(1)
O(1)判断父子关系
详见 倍增求LCA(时间戳法)
三、用途
- 倍增求LCA
- 强连通分量(tarjan、Kosaraju)
- 割点、桥、边双连通分量、点双连通分量