有向非循环图中两个顶点之间的最大加权路径

时间:2014-11-17 20:38:12

标签: algorithm graph graph-theory directed-acyclic-graphs

喜欢这个问题的一些指导:

G是有向无环图。您想要从顶点c移动到顶点z。一些边缘会降低您的利润,一些会增加您的利润。如何在最大化利润的同时从c到z。什么是时间复杂度?

谢谢!

3 个答案:

答案 0 :(得分:1)

问题有一个最佳的子结构。要查找从顶点c到顶点z的最长路径,我们首先需要找到从cz的所有前导的最长路径。这些问题的另一个问题是另一个较小的子问题(从c到特定前任的最长路径)。

让我们将z的前身u1,u2,...,ukdist[z]表示为从cz然后dist[z]=max(dist[ui]+w(ui,z))的最长路径。

以下是3个前辈省略边集义度的说明:

enter image description here

为了找到z的最长路径,我们首先需要找到其前任的最长路径并取最大路径(它们的值加上它们的边缘权重为z)。

这要求每当我们访问顶点u时,必须分析和计算所有u的前辈。

所以问题是:对于任何顶点u,如何确保在设置dist[u]之后,dist[u]以后永远不会更改?换句话说:在考虑c处的任何边缘之前,如何确保我们已考虑从uu的所有路径?

由于图是非循环的,我们可以通过在图上找到拓扑排序来保证这种情况。拓扑排序就像一个顶点链,所有边都从左到右指向。因此,如果我们位于顶点vi,那么我们已经考虑了所有路径vi并且最终值为dist[vi]

时间复杂度:拓扑排序需要O(V+E)。在最糟糕的情况下,z是一个叶子而所有其他顶点都指向它,我们将访问所有图形边缘,它们会给出O(V+E)

答案 1 :(得分:0)

f(u)成为您在DAG中从 c u 的最大利润。然后你想要计算 f(z)。这可以使用动态编程/拓扑排序在线性时间内轻松计算。

c 以外的每个 u 初始化 f(u)= -infinity, f(c)= 0 < / em>的。然后,继续以DAG的某些拓扑顺序计算 f 的值。因此,当顺序是拓扑时,对于正在计算的节点的每个输入边缘,计算其他端点,因此只需选择该节点的最大可能值,即 f(u)= max( f(v)+ cost(v,u))每个传入边(v,u)

答案 2 :(得分:0)

自DAG以来,最好使用Topological Sorting代替Bellman Ford

来源: - http://www.utdallas.edu/~sizheng/CS4349.d/l-notes.d/L17.pdf

修改: -

G是具有负边缘的DAG。

  

有些边缘会降低您的利润,有些会增加您的利润

  • 边缘 - 增加利润 - 正值
  • 边缘 - 减少利润 - 负值

在TS之后,对于TS顺序中的每个顶点U,放松每个输出边缘。

dist[] = {-INF, -INF, ….}
dist[c] = 0 // source

for every vertex u in topological order
  if (u == z) break; // dest vertex
  for every adjacent vertex v of u
    if (dist[v] < (dist[u] + weight(u, v))) // < for longest path = max profit
      dist[v] = dist[u] + weight(u, v)

ans = dist[z];