dfs拓扑排序原理详解--------还不明白请来砍我

算法道路第三版pdf:https://blog.csdn.net/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必定晚于其任一子节点的完成时间

(下面是一次简单的演示)
在这里插入图片描述
------------------基于DFS的拓扑排序---------------------------------------------------------

关键点我写在最后面

演示demo:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

关键点(图在最后):
#1:最开始的@2:B依赖于A,那么A的完成时间必定比B晚,那么我们只需要最先找到那个完成时间最晚的那个点并完成它,然后在继续找剩余点中完成时间最晚的那个点,依次递推(所以只需按完成时间增序排一下序即可)


#2:上图不是联通的,那么我们从几个不同的点开始dfs遍历,我们把由同一个点进行dfs可以访问到的点归到同一个集团,如下图:分为A,B,C,D四个集团。我们接下来的任务就是说明:任意的集团访问顺序对我们得到一个正确的拓扑排序没有影响,只是不同而已。


#2.1:拓扑排序算法总方法:我们只要找从完成时间最晚的那个点(袜子(18))开始,按完成时间降序输出所有点即可的到最终的拓扑排序。


#2.2:由算法可以知道:任意两个集团A,B。要么A中最晚的完成时间小于B中最小的开始时间,要么B中最晚的完成时间要小于A的最早的开始时间
一举个例子:鞋子和袜子分属于B,C两个集团,B集团最晚完成时间(16)要晚于C集团的最早开始时间(18)。
这个结论告诉我们当我们把c集团全部完成时那么c集团中指向B集团中边我们可以忽略掉。举个例子,B集团的鞋子依赖于c集团的袜子,那么当c集团完成时,我们在完成鞋子时可以去掉袜子连到鞋的那条边,因为c集团早就完成了;同理可得A集团的腰带可以不用管B集团的裤子,因为B集团早就完成了。(这个结果相当于基于栈的拓扑排序算法中顶点入度减一)


综上,dfs的集团遍历顺序为A,D,B,C,那么只需反过来按照C,B,D,A的集团完成顺序输出,我们可以得到(b)所示结果,即我们只按最晚完成时间降序输出结果即可得到一个正确的拓扑排序(袜子,内裤,裤子,鞋,手表,衬衣,腰带,领带,夹克)

在这里插入图片描述

  • 29
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值