Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 具有多个tsort解的DAG的唯一拓扑排序_Sorting_Graph Algorithm_Topological Sort - Fatal编程技术网

Sorting 具有多个tsort解的DAG的唯一拓扑排序

Sorting 具有多个tsort解的DAG的唯一拓扑排序,sorting,graph-algorithm,topological-sort,Sorting,Graph Algorithm,Topological Sort,我有一个DAG(有向无环图),它有多个有效的拓扑排序。我正在寻找一种方法对其进行拓扑排序,并应用二级排序,以始终获得相同的、定义良好的结果 例如,以下图为例: A-->B A-->C B-->D C-->D 拓扑排序有两种解决方案: 1:A、B、C、D和 2:A,C,B,D 我们注意到B和C可以按任何顺序排序。因此,我们选择字母排序作为二级排序,只得到一个解决方案:A、B、C、D 这可以推广到任何DAG吗?这是如何实现的?因此,您要问的问题更多是指编程语义,而不是算法本身。基本层次的拓扑排序算法

我有一个DAG(有向无环图),它有多个有效的拓扑排序。我正在寻找一种方法对其进行拓扑排序,并应用二级排序,以始终获得相同的、定义良好的结果

例如,以下图为例:

A-->B

A-->C

B-->D

C-->D

拓扑排序有两种解决方案:

1:A、B、C、D和

2:A,C,B,D

我们注意到B和C可以按任何顺序排序。因此,我们选择字母排序作为二级排序,只得到一个解决方案:A、B、C、D


这可以推广到任何DAG吗?这是如何实现的?

因此,您要问的问题更多是指编程语义,而不是算法本身。基本层次的拓扑排序算法假设用户将调整算法,以考虑他/她可能需要算法执行的任何操作。因此,为了得到ABCD解而不是ACBD解,您需要在算法中声明,在有两个可能的候选字符的情况下,将选择字母优先的字符。为了将其推广到任何DAG,实际上只需在算法中指定它


另一方面,如果您想确保每次都不会选择相同的节点顺序,您可以在有多个候选节点时随机选择节点的方式。

因此,您要问的问题更多是指编程语义,而不是算法本身。基本层次的拓扑排序算法假设用户将调整算法,以考虑他/她可能需要算法执行的任何操作。因此,为了得到ABCD解而不是ACBD解,您需要在算法中声明,在有两个可能的候选字符的情况下,将选择字母优先的字符。为了将其推广到任何DAG,实际上只需在算法中指定它


另一方面,如果希望确保每次不会选择相同的节点顺序,则可以在有多个候选节点时随机化选择节点的方式。

难道不能使用带平分功能的标准拓扑排序吗?也就是说,不要使用DFS方法,而是迭代(或递归)移除顶点并将其排队,没有剩余的限制。每次有多个不受限制的顶点可用时,请使用“断开连接”功能在它们之间进行选择。您的断链函数(我理解您的问题)只需选择标签按字母顺序首先出现的顶点。

您不能将标准拓扑排序与断链函数一起使用吗?也就是说,不要使用DFS方法,而是迭代(或递归)移除顶点并将其排队,没有剩余的限制。每次有多个不受限制的顶点可用时,请使用“断开连接”功能在它们之间进行选择。您的平局断路器功能(我理解您的问题)只需选择其标签按字母顺序首先出现的顶点。

jcm69的答案可在此处找到:jcm69的答案可在此处找到: