算法道路第三版pdf:https://blog.youkuaiyun.com/qq_34384524/article/details/82834519
我们不创造算法,我们只是算法的搬运工
依赖:穿鞋子之前需要穿袜子,则箭头是由鞋子指向袜子,称袜子依赖于鞋子
个人笔记之核心点:
@1:dfs在实现时不仅访问了顶点,最关键的是我们还给每个顶点加上了时间戳(一个开始时间和一个结束时间)。
@2:dfs拓扑排序时,如果顶点B的完成依赖于A的完成,那么A的结束时间必定晚于B,那么只要找到一个结束时间最晚的点S,那么就没有任何其他的点依赖于点S的完成,那么点S就可以顺利完成。
先讲带时间戳的DFS再讲基于DFS的拓扑排序
以下内容主要搬运自算法导论,重要的地方我会在图片开头做出注释,用粗体字标记。
注释:
u.π:u的前驱
u.d:开始时间
u.f:完成时间
time为全局变量
关键点:
DFS_VISIT:
第2行和第10行:u.d必定小于u.f
第4~7行:由递归的特性可以知道,在第10行即设置u的完成时间u.f之前,其全部子节点的开始时间和结束时间已经全部知道了了
第9~10行:从这里我们可以得到前文@2:u的子结点依赖于u,那么u的结束时间u.f必定晚于其任一子节点的完成时间
(下面是一次简单的演示)