算法学习(十一)拓扑排序

拓扑排序

1. 概念

  • 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。
  • 简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

过程:

markdown 复制代码
在一个有向图中,对所有的节点进行排序,要求没有一个节点指向它前面的节点。
先统计所有节点的入度,对于入度为0的节点就可以分离出来,然后把这个节点指向的节点的入度减一。
一直做改操作,直到所有的节点都被分离出来。
如果最后不存在入度为0的节点,但还存在节点,那就说明有环,不存在拓扑排序,也就是很多题目的无解的情况。

算法:

markdown 复制代码
第一种方式

是遍历整个图中的顶点,找出入度为0的顶点,然后标记删除该顶点,更新相关顶点的入度,由于图中有V个顶点,每次找出入度为0的顶点后会更新相关顶点的入度,因此下一次又要重新扫描图中所有的顶点。故时间复杂度为O(V^2)

问题:由于删除入度为0的顶点时,只会更新与它邻接的顶点的入度,即只会影响与之邻接的顶点。但是上面的方式却遍历了图中所有的顶点的入度。
第二种方式(更优的算法)

先将入度为0的顶点放在栈或者队列中。当队列不空时,删除一个顶点v,然后更新与顶点v邻接的顶点的入度。只要有一个顶点的入度降为0,则将之入队列。此时,拓扑排序就是顶点出队的顺序。该算法的时间复杂度为O(V+E)

2. 解题技巧(我的总结)

1> 拓扑排序

题目 说明 实现
210. 课程表 II 拓扑排序 我的提交
310. 最小高度树 拓扑排序 我的提交
684. 冗余连接 拓扑排序 我的提交

3. 更多练习

4. 参考

  1. 拓扑排序及算法实现
  2. 总库:tryHard
相关推荐
qq_416018723 分钟前
实时数据可视化库
开发语言·c++·算法
格林威3 分钟前
工业相机参数解析:曝光时间与运动模糊的“生死博弈”
c++·人工智能·数码相机·opencv·算法·计算机视觉·工业相机
雷工笔记13 分钟前
AI使用|通过AI学习物料分类编码表
笔记·学习
2401_8732046517 分钟前
C++中的策略模式进阶
开发语言·c++·算法
xushichao198922 分钟前
C++中的职责链模式实战
开发语言·c++·算法
大鹏说大话29 分钟前
数据库查询优化全攻略:从索引设计到架构演进
算法
小O的算法实验室29 分钟前
2025年IEEE TETCI SCI2区,一种用于二次无约束二进制优化的协同神经动力学算法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
2301_8184190135 分钟前
C++中的协程编程
开发语言·c++·算法
add45a37 分钟前
C++中的工厂方法模式
开发语言·c++·算法
無限進步D44 分钟前
二分算法 cpp
算法