我想在这个图中找到Topological Sort的每个顶点都有数字标签的非循环图;但是图形可能包含几个拓扑顺序,但我想找到具有数字顺序的特定顺序,请参见下面的图片以获得更多解释
如上图所示,该图包含几个拓扑顺序
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
我想知道如何更改拓扑排序算法以找到这个特定的顺序
这是另一个例子:
在示例图中,这两个顺序为真
2 1 0
但是当我使用第一个答案排序函数时,它将交换2和0,最终结果将是0 1 2
,这是一个错误的答案
答案 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) ;
}
需要考虑的一个非常重要的事情是,只有在传递的顶点按照提供的拓扑顺序连续时,此比较方法才能正常工作。
所以我们必须选择一种总是只比较连续元素的排序算法。是的,泡泡排序!!!
请注意,您可以直接使用冒泡排序来获取订单,但如果您已经拥有拓扑排序的输出并希望获得更有序的排序,则应使用上述方法。