“一个 phase 先从所有未匹配的 $L$ 顶点做多源BFS,只在交替方向上前进,并在首次到达未匹配右点的距离处截断。得到的层次图精确包含当前最短增广路可能使用的方向边。随后从各未匹配左点做…”
形式陈述 ​
给定有限图
递归调用或等价的显式栈在任一时刻保存一条 DFS 树根到当前顶点的活动路径。对白—灰—黑三色状态,白色尚未发现,灰色已发现但未完成,黑色已经完成。时间区间满足括号定理:任意两个顶点的区间
要么不交,要么一个严格包含另一个;在后一种情形中,外层顶点是内层顶点在 DFS 森林中的祖先。这个嵌套不变量支撑环检测、拓扑排序和许多 low-link 算法。
设
颜色、父指针、时间戳与最深调用栈共用
直觉
DFS 把“稍后继续处理的分支”留在栈帧中,先把当前分支走到底。发现时间记录进入嵌套区间的时刻,完成时间记录退出;搜索树因此把一次线性扫描转成了祖先关系。邻接次序会改变树、时间戳和输出顺序,却不会改变从给定源可达的顶点集合。
与按层推进的广度优先搜索相比,DFS 没有距离单调性。它换来的信息是活动路径和退出顺序:灰色顶点恰是当前递归祖先,遇到指向灰色祖先的边便得到了一个有向圈证据。
例子与边界
在有向图
中,若
有向图中,指向白点的是树边,指向灰色祖先的是回边;指向黑点的边要结合时间区间区分前向边与交叉边。有向图无环当且仅当任意完整 DFS 森林都没有回边。无向图的非树边只连接祖先与后代,但扫描父边的反向记录不构成圈;若允许平行边,必须按边 ID 排除那一条父边,因为另一条平行边确实形成长度为二的多重图圈。
DFS 首次找到的路径一般不是最短路:在边
推论与应用
逆完成序可构造拓扑排序,两次 DFS 可分解强连通分量,发现时间与Low-link 值可识别桥、割点和分量。它们共享遍历骨架,正确性却分别依赖“无回边”“凝聚图次序”或“子树能回到多早”的附加不变量。
发现/完成区间还把 DFS 树的子树映成嵌套区间,树的 Euler Tour 技巧据此支持祖先或子树查询。一般有向图的非树边不会因此消失;只有先明确要查询的是 DFS 森林结构,才能把区间结论用于原图问题。
在单入口 flow graph 中,Lengauer–Tarjan 算法借 DFS 编号组织半支配点,但 DFS parent 只代表首次到达,未必支配子节点。边一旦插删,原有搜索树、时间区间和边分类都可能改变;本页的线性界只描述一次静态遍历,不是动态图维护保证。
参考资料
- Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Ch. 20。
- Jon Kleinberg and Éva Tardos, Algorithm Design, Pearson, 2005,§3.3。