给定一个有向无环图 G = (V,E),可以假设已经进行了拓扑排序(如果需要)。G 中的边具有两种类型的成本 - 常规成本 w(e) 和尖峰成本 p(e)。
目标是找到从节点 s 到节点 t 的最短路径,其中最小化以下成本: sum_e (w(e)) + max_e (p(e)),其中 sum 和 maximum 是在路径上的所有边上进行的。
标准动态规划方法表明,这个问题可以在 O(E^2) 时间内解决。是否有更有效的方法来解决它?理想情况下,一个 O(E*polylog(E,V)) 算法会很好。
---- 编辑 -----
这是我使用动态规划找到的 O(E^2) 解决方案。
首先,按升序排列所有成本 p(e)。这需要 O(Elog(E)) 时间。
其次,定义由状态(x,i)组成的状态空间,其中 x 是图中的一个节点,i 在 1,2,...,|E| 中。它表示“我们在节点 x 上,并且我们已经看到的最高边权重为第 i 大”。
设 V(x,i) 是从 s 到 x 的最短路径长度(在经典意义下),其中遇到的最高 p(e) 是第 i 大。很容易计算出 V(x,i),给定任何前驱 y 的 V(y,j),其中 j 在 1,...,|E| 中(有两种情况要考虑 - 边 y->x 具有第 j 大的权重,或者它没有)。
在每个状态 (x,i) 处,此计算找到约 deg(x) 个值的最小值。因此,复杂度为 O(|E| * sum_(x\in V) deg(x)) = O(|E|^2),因为每个节点与 |E| 不同的状态相关联。
目标是找到从节点 s 到节点 t 的最短路径,其中最小化以下成本: sum_e (w(e)) + max_e (p(e)),其中 sum 和 maximum 是在路径上的所有边上进行的。
标准动态规划方法表明,这个问题可以在 O(E^2) 时间内解决。是否有更有效的方法来解决它?理想情况下,一个 O(E*polylog(E,V)) 算法会很好。
---- 编辑 -----
这是我使用动态规划找到的 O(E^2) 解决方案。
首先,按升序排列所有成本 p(e)。这需要 O(Elog(E)) 时间。
其次,定义由状态(x,i)组成的状态空间,其中 x 是图中的一个节点,i 在 1,2,...,|E| 中。它表示“我们在节点 x 上,并且我们已经看到的最高边权重为第 i 大”。
设 V(x,i) 是从 s 到 x 的最短路径长度(在经典意义下),其中遇到的最高 p(e) 是第 i 大。很容易计算出 V(x,i),给定任何前驱 y 的 V(y,j),其中 j 在 1,...,|E| 中(有两种情况要考虑 - 边 y->x 具有第 j 大的权重,或者它没有)。
在每个状态 (x,i) 处,此计算找到约 deg(x) 个值的最小值。因此,复杂度为 O(|E| * sum_(x\in V) deg(x)) = O(|E|^2),因为每个节点与 |E| 不同的状态相关联。