分别使用Kahn和DFS实现拓扑排序

1,先了解什么是偏序?

偏序就是图中存在无先后顺序的顶点对。全序即找不到这样的顶点对。

2,什么是拓扑排序?

把图由偏序变成全序的操作即是拓扑排序。前提是有向无环图,拓扑才能成功。

3,Kahn算法思想:先把入度为0的点入栈,每次从中出栈一个顶点,删除从它出发的边,相应顶点的入度减少1,若有入度为0的点,则入栈,重复至栈为空。

4,DFS思想:前提是有向无环图,因为最先完成DFS的顶点恰好拓扑排序中最后一个完成的,最后完成DFS正好是拓扑排序中入度为0的顶点。

下边是代码:

test2.txt中内容为:

12 16
0 1
0 2
1 2
0 3
2 4
3 4
10 5
4 6
2 6
2 7
5 7
8 9
8 10
8 11
9 11
0 11

用Kahn算法求出来的结果为:


用DFS算法求出来的结果为:


两个结果是一样的。

Kahn的时间复杂度为O(n+e);

DFS的时间复杂度为O(n+e),空间复杂度都为O(n);

应用背景:在有关工程进度/次序的规划问题中,拓扑排序有着大量应用。

少了个释放空间的操作:

若数据集为下边这种格式:第一行为顶点数,边数;其他行的意思分别为:弧尾,出度,弧头结点列

10 12
0 2 1 2
1 2 3 4
2 2 3 5
3 1 7
4 1 8
5 1 6
6 1 8
7 2 8 9
8 0
9 0

则建立邻接表的代码为:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值