什么是拓扑排序?
拓扑排序顾名思义是一种排序算法,它用于给有向图排序。
有向图是由一组顶点和一组有方向的边组成的图,每条有方向的边都连接着有序的一对顶点,因此A -> B代表A可以到达B,并不代表B就能到达A。
拓扑排序的结果就是一个有向图的顶点序列(或称为拓扑序列)。
举例:计算机课程的安排
想要学习《C++程序设计》就需要先学习《计算机导论》
想要学习《数据结构和算法》就需要先学习《C++程序设计》
想要学习《网络操作系统》就需要先学习《计算机导论》
由此可以看出,这些活动都是有序的,每门课程就是图中的顶点,而有向边便是学习的顺序。你不能先学习《C++程序设计》,再学习《计算机导论》。就好比你不能先脱内衣,再脱外套一样。
那么,有向图是否就能拓扑排序呢?答案是不一定的。当图中存在环路时,比如学习A之前要学习B,学习B之前又要学习A,那么顺序就不可控了(到底A在前还是B在前?),故拓扑排序的充要条件是它是有向无环图。AOV网(顶点活动网)就是一种有向无环图。
同时,拓扑排序有时是不唯一的,如上图,学习顺序可以是:
《计算机导论》 -> 《C++程序设计》 -&g