最近在看一些图算法,发现拓扑排序频繁出现,这里写一下自己的一些总结。拓扑排序是对于有向无环图而言的(DAG),就是对于这个图所有的点(V1, V2, … Vn)找到一个点序列使得任意边(u, v), u出现在v的前面。很容易证明,如果一个有向图中有环那么不存在拓扑排序。现实中的问题首先来看现实中哪些问题需要拓扑排序的,课程排序,编译依赖问题,类似的凡是涉及到相关顺序的时间安排,比如Rails里面的初始化调用了库Tsort来进行排序。Unix中有个命令也叫tsort,在有的makefile里面还直接使用了这个命令来解决依赖问题。O(V+E)的算法拓扑排序的基本算法是用DFS,我们希望把有出度的点尽量排在前面,所以这里需要注意和DFS的区别。比如上面图中的一个DFS访问顺序是: 5 2 3 1 0 4, 但是这不是一个拓扑排序,4需要排在0的前面,5, 4, 0, 2, 3, 1。
拓扑排序中需要等迭代完节点的连接邻点后再把当前点压入栈。#include#include#include#includeusingnamespacestd;classGraph{intV;list*adj;void_topological_sort(intv,boolvisited[],stack&stack;);public:Graph(intv);~Graph();voidaddEdge(intv,in
...
继续阅读
(32)