拓扑排序

原创、转载请注明出处

       和普通排序不同的是,拓扑排序不知道元素的具体大小,只有元素间的部分关系,最后的结果是把这些元素串起来。(拓扑排序是图论中的一个问题:把一个图的所有结点排序,使得每一条有向边(u,v)对应的u都排在v的前面)

       首先,我们知道,拓扑排序最终要确定一个序列,那么向这个序列放一个元素时,要确保所有指向这个元素的所有元素都放进去了。

       最直接的想法是,把每个元素前面的结点列出,没有前面结点的放入序列,把放入序列的结点从其他结点记录中删除,再把没有前面结点的放到序列中,一直到所有结点都放入序列中。(如果这个办法最终不能把所有结点都放到序列中,说明不能形成序列,对应图是有环图)

       另一种想法就是用dfs搜图,没有上面的好想,但是比上面的方法高效:从每个u结点((u,v)中的u)开始深搜,(发现不好讲,举个例子):

       比如说,从a点开始深搜,访问的序列是1,然后是2,2返回到2条路径的相交处才会访问3路径,在返回(也就是递归的回溯)时,把2路径上的结点从尾到头放到结果序列的头部,以此类推,会把4、5、3、1上的结点放到结果序列中,这样从a结点开始的深搜就结束了;然后深搜6、7上的结点时,6、7也会被访问到,回溯时把结点放到结果序列中。

       另外,判断有没有环就是把正在深搜中的结点设为-1,如果路径走到-1的结点了,说明有环。放到结果序列中的结点是1,不可能有路径再指向结点都为1的路径。没有访问过的结点是0。

posted @ 2017-10-10 21:03  哲贤  阅读(157)  评论(0编辑  收藏  举报