一、深度优先搜索
它的定义是:递归探索图,必要时要回溯,同时避免重复。
关于深度优先搜索的伪代码如下:
左边DFS-Visit(V, Adj.s)是只实现visit所有连接某个特定点(例如s)的其他点。右边是实现整张图的visit,即DFS(v, Adj)。DFS-Visit是DFS的重要组成模块。
用上图右侧的实例图解释下运作过程:
DFS的时间复杂度如下(这里不做多余的解释):
二、边分类
Edge Classification可以解决两个问题:cycle detection和topological sort。
它有四种边:
(如果是无向图,只存在tree edge和backward edge)
三、循环检测
如果图G有个循环,那么DFS就存在反向边back edge。反过来也成立,即如果DFS就存在反向边back edge,图G就有个循环。
四、拓扑排序
在Job scheduling问题上,给定有向非循环图(DAG),排序点使得所有变从低位指向高位。这里使用拓扑排序Topological sort可以实现:使用DFS,然后反着输出点的完成时间。这这里面有个常理就是对于任何从u到v的边即e =(u,v),都满足v完成早于u完成。
[MIT6.006] 14. Depth-First Search (DFS), Topological Sort 深度优先搜索,拓扑排序
原文:https://www.cnblogs.com/alvinai/p/12721032.html