跳转至

DFS 序相关

dfs 序ψ(`∇´)ψ

此处说的 dfs 序是访问到这个节点的时间戳 dfn。

最重要的性质就是,子树内的 dfn 是连续的一段区间。

所以可以用于子树的操作和询问。

括号序ψ(`∇´)ψ

dfs,进入某个节点的时候记录一个左括号 (,退出某个节点的时候记录一个右括号 )。

每个节点会出现两次。相邻两个节点的深度相差 1。

这个东西必然是一个合法括号序列,并且一个节点对应的配对的一对括号之内可以代表这个节点的子树。

树上莫队会用到。

欧拉序ψ(`∇´)ψ

之后补。

dfs 树ψ(`∇´)ψ

这里是无向图的 dfs 树。

横叉边的定义和关于连通性的 tarjan 算法里面一样。

回边就是连通 dfs 树上节点和祖先节点的一条非 dfs 树边。

有一个重要的性质:

无向简单连通图 \(G\) 的非 dfs 树边,都不是横叉边(全部都是回边)。

Proof:

证明:假设有一条边 \(u \to v\),dfs 已经访问过了 \(u\) 但还没访问到 \(v\)。

然后会有两种情况,

如果沿着 \(u\to v\) 这条边,dfs 由 \(u\) 去向 \(v\),那么 \(u\to v\) 就是一条树边。

如果深度优先遍历没有沿着 \(u\to v\) 这条边从 \(u\) 走到 \(v\),

那么证明最后访问到 \(v\) 的时候,是从 \(u\) 出发走了另外一条路径,然后再到 \(v\) 的。

所以 \(v\) 就一定是 \(u\) 的一个子孙节点,\(u\to v\) 就是一条回边。

可以看一看来自 https://codeforces.com/blog/entry/68138 的一张图理解一下:

dfsorder-1.gif

bfs 树ψ(`∇´)ψ

这里是无向图的 bfs 树。

有一个重要的性质:

无向简单连通图 \(G\) 的非 bfs 树边,都是横叉边(全部都不是回边)。

且这些边连接的节点的层数差的绝对值小于等于 \(1\)。

Proof:

我们可以类比 dfs 树那里的过程。

考虑存在一条边 \(u \to v\),并且此时已经访问过了 \(u\),没有访问 \(v\).

那么会有以下的量种情况:

1:如果沿着 \(u \to v\) 这条边访问了 \(v\),那么 \(u \to v\) 就是树边。

2:如果没有沿着 \(u \to v\) 这条边访问 \(v\),因为 bfs 是按层扩展的,所以 \(u\) 的下一次必然会扩展到 \(v\)。

但是 \(v\) 没有通过 \(u\) 扩展到,所以第一种可能就是它是和 \(u\) 同层的节点,被同时扩展过。

也有一种可能是 \(u\) 确实能扩展到 \(v\),但是和 \(u\) 同层的某个节点也能扩展到 \(v\),那么 \(u\) 就没法扩展到 \(v\)。

最后的一种可能是 \(v\) 是 \(u\) 的上层节点,这是不可能出现的,因为这样的话肯定是 \(v\) 先被扩展到。

所以绝对值的结论可以用情况 2 的第一二种可能证明,其他的可以用来证明横叉边的结论。


最后更新: May 9, 2023