查找拓扑排序的数字顺序

时间:2016-10-25 21:04:30

标签: algorithm sorting topological-sort

我想在这个图中找到Topological Sort的每个顶点都有数字标签的非循环图;但是图形可能包含几个拓扑顺序,但我想找到具有数字顺序的特定顺序,请参见下面的图片以获得更多解释 enter image description here

如上图所示,该图包含几个拓扑顺序 4 5 6 1 2 3
1 4 2 5 6 3
1 2 4 5 3 6
1 2 3 4 5 6
......
但是我需要这个订单1 2 3 4 5 6我想知道如何更改拓扑排序算法以找到这个特定的顺序

这是另一个例子:
enter image description here
在示例图中,这两个顺序为真 2 1 0
但是当我使用第一个答案排序函数时,它将交换2和0,最终结果将是0 1 2,这是一个错误的答案

1 个答案:

答案 0 :(得分:1)

如果您对拓扑排序算法的输出再执行一次排序,并在排序时使用以下比较函数,则更好:

//Suppose we have a method which returns true if an edge exists between two nodes.
//returns false otherwise.
edgeExists(node1,node2) ==true  // node1->node2

//The compare function
//consider node.value as vertex number.
bool compare(node1, node2){
    if(node1.value > node2.value && !edgeExists(node1,node2))
         return false;

    return true;
}

以下是@Gene建议的比较方法的优化:

bool compare(node1, node2){
      return (edgeExists(node1,node2) || node1.value < node2.value) ;
}

需要考虑的一个非常重要的事情是,只有在传递的顶点按照提供的拓扑顺序连续时,此比较方法才能正常工作。

所以我们必须选择一种总是只比较连续元素的排序算法。是的,泡泡排序!!!

请注意,您可以直接使用冒泡排序来获取订单,但如果您已经拥有拓扑排序的输出并希望获得更有序的排序,则应使用上述方法。