在DAG中找到两个顶点之间的最短和最长路径


14

给定一个未加权的DAG(有向无环图)以及两个顶点和,是否有可能找到多项式时间内从到的最短和最长路径?路径长度由边的数量测量。s t s tD=(V,A)stst

我对寻找多项式时间内可能的路径长度的范围感兴趣。

附言:此问题与StackOverflow问题DAG中最长路径的重复。

Answers:


10

对于最短路径问题,如果我们不关心权重,那么广度优先搜索是一种肯定的方法。否则,只要没有负边缘,Dijkstra的算法就可以工作。

对于最长的路径,您可以始终在图上使用Bellman-Ford忽略所有边缘权重。回想一下,只要没有负重量周期,Bellman-Ford就可以工作,因此可以在DAG上使用任何重量。


2
Bellman-Ford 一种动态编程算法。
拉斐尔

1
@Raphael是的,但是我认为有一种直接的DP算法可以找到最大路径,而不是消除所有边缘权重。
jmite 2013年

1
@jmite:为什么会这样:当然:只要更改Bellman-Ford在线进行转换,或最大化,或...
Raphael

1
顺便说一下,我没有直觉上相信NP完全问题Longest Path因此很容易在DAG的P中出现。我会很感激的证明/参考/解释。
拉斐尔

2
还有一种针对DAG

8

令和。令表示边缘的权重。假设您要查找从到的最小和最大路径开销。m = | E G | w a b a b s tn=|V(G)|m=|E(G)|w(ab)(ab)st

从,执行以下操作:b:=t

  1. 如果已经访问过,则返回已经计算出的和。否则,将标记为已访问。bmin(b)max(b)b

  2. 如下确定并记录和。min(b)max(b)

    • 如果,则存储。b=smin(s):=max(s):=0
    • 其他设置忽略了。当计算一组空边的最大值和最小值时(根本没有入站边,或者全部被忽略),请设置。
      min(b):=minab[w(ab)+min(a)]max(b):=maxab[w(ab)+max(a)]
      min(a)=max(a)=inaccessiblebmin(b):=max(b):=inaccessible

您应该能够证明该算法在时间,而忽略了初始化所有顶点变量所需的时间。O(m)


这种递归“拉”方法实际上可能比通常的动态“推”方法要慢,并且它需要一个线性大小的堆栈来处理递归。通常的方法是按照拓扑顺序获取顶点,并为当前节点的每个邻居提高临时最小值和最大值。当前节点始终具有最小值和最大值的最终值,因为必须已经使用所有入站边缘对其进行了改进。
Palec 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.