有向非循环图及其拓扑排序(指定优先级)

时间:2017-05-14 13:15:32

标签: c++ algorithm graph scheduling directed-acyclic-graphs

我有一个有向无环图,如下图所示。

我想要实现的是获得**拓扑排序,其中每个节点都具有稍后用于调度的优先级p(其中更高的值意味着更高的优先级)

通过访问每个节点和边一次(O(| V | + | E |)(https://en.wikipedia.org/wiki/Topological_sorting#Depth-first_search

,可以在线性时间内计算如下图所示的线性列表的拓扑排序

但是,当分配优先级的任务发挥作用时,到目前为止我找不到比下面更好的算法。

  1. 为图n中的每个节点g分配优先级p=0
  2. 对于图n中的每个节点g
    • 从节点n开始深度优先递归
      • n遍历子图时
        • 如果父节点已经具有更高的优先级作为当前节点,您不需要更深入,并且您可以继续深度中的其他节点 - 第一次递归。
        • 如果优先级相等或更低, 将父节点的优先级设置为优先级 当前节点+ 1和访问父
  3. (有一些小的优化:忽略我们已经开始DFS的子图,只增加子图的优先级偏移量,然后每个节点的优先级由其本地优先级+子图的优先级偏移量计算)

    n开始的每个深度优先递归都不能通过忽略上面for循环中已经访问过的节点而变得更简单,就像它可以用于简单的拓扑排序一样(图像中的线性列表,({{3 }}))

    首先计算拓扑排序(O(| V | + | E |)然后迭代线性列表并分配优先级(O(| V | + | E |)? 我希望有一个不太明确的优先级,以允许并行调度(节点D和E可以在图像中同时安排)

    https://en.wikipedia.org/wiki/Topological_sorting#Depth-first_search

0 个答案:

没有答案