繁体   English   中英

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

[英]Maximum weighted path between two vertices in a directed acyclic Graph

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

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

谢谢!

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

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

下面是3个前辈省略边集权重的说明:

在此输入图像描述

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

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

所以问题是:对于任何顶点u ,如何确保一旦我们设置dist[u]dist[u]以后永远不会改变? 换句话说:如何确保在考虑任何来自u边缘之前我们已经考虑了从cu所有路径?

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

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

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

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

自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];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM