喜欢这个问题的一些指导:
G是有向无环图。您想要从顶点c移动到顶点z。一些边缘会降低您的利润,一些会增加您的利润。如何在最大化利润的同时从c到z。什么是时间复杂度?
谢谢!
答案 0 :(得分:1)
问题有一个最佳的子结构。要查找从顶点c
到顶点z
的最长路径,我们首先需要找到从c
到z
的所有前导的最长路径。这些问题的另一个问题是另一个较小的子问题(从c
到特定前任的最长路径)。
让我们将z
的前身u1,u2,...,uk
和dist[z]
表示为从c
到z
然后dist[z]=max(dist[ui]+w(ui,z))
的最长路径。
以下是3个前辈省略边集义度的说明:
为了找到z
的最长路径,我们首先需要找到其前任的最长路径并取最大路径(它们的值加上它们的边缘权重为z
)。
这要求每当我们访问顶点u
时,必须分析和计算所有u
的前辈。
所以问题是:对于任何顶点u
,如何确保在设置dist[u]
之后,dist[u]
以后永远不会更改?换句话说:在考虑c
处的任何边缘之前,如何确保我们已考虑从u
到u
的所有路径?
由于图是非循环的,我们可以通过在图上找到拓扑排序来保证这种情况。拓扑排序就像一个顶点链,所有边都从左到右指向。因此,如果我们位于顶点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];