拓扑排序,是对有向无回路图(顶点活动网络AOV网)进行排序,以期找到一个线性序列,这个线性序列在生活正可以表示某些事情完成的相应顺序。如果说所求的图有回路的话,则不可能找到这个序列。
在大学数据结构课上,我们知道求拓扑排序的一种方法。首先用一个入度数组保存每个顶点的入度。在进行拓扑排序时,我们需要找到入度为0的点,将其存入线性序列中,再将其从图中删除(与它相关的边都删除,相邻的顶点的入度均减1),再重复上面的操作,直至所有的顶点都被找到为止。如果不对每次找入度为0的顶点的方法进行处理,而直接去遍历入度数组,则该算法的时间复杂度为O(|V|2),如果使用一个队列来保存入度为0的顶点,则可以将这个算法的复杂度降为O(V+E)。
今天在算法导论上看了用dfs来求拓扑排序的算法,才发现其高深之处,膜拜之Orz…
下面是算法导论的叙述:
本节说明了如何运用深度优先搜索,对一个有向无回路图(dag)进行拓扑排序。对有向无回路图G=(V,E)进行拓扑排序后,结果为该图顶点的一个线性序列,满足如果G包含边(u, v),则在该序列中,u就出现在v的前面(如果图是有回路的,就不可能存在这样的线性序列)。一个图的拓扑排序可以看成是图中所有顶点沿水平线排列而成的一个序列。使得所有的有向边均从左指向右。因此,拓扑排序不同于通常意义上的排序。
在很多应用中,有向无回路图用于说明时间发生的先后次序(例如大学选课的先修课程),下图1即给出一个实例,说明Bumstead教授早晨穿衣的过程。他必须先穿好某些衣服,才能再穿其他衣服(如先穿袜子后穿鞋),其他一些衣服则可以按任意次序穿戴(如袜子和裤子)ÿ