![](/img/trans.png)
[英]Check if there exist a path between two vertices in directed acyclic graph - queries
[英]Maximum weighted path between two vertices in a directed acyclic Graph
喜欢这个问题的一些指导:
G是有向无环图。 您想要从顶点c移动到顶点z。 一些边缘会降低您的利润,一些会增加您的利润。 如何在最大化利润的同时从c到z。 什么是时间复杂度?
谢谢!
该问题具有最佳子结构。 为了找到从顶点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]
以后永远不会改变? 换句话说:如何确保在考虑任何来自u
边缘之前我们已经考虑了从c
到u
所有路径?
由于图是非循环的,我们可以通过在图上找到拓扑排序来保证这种情况。 拓扑排序就像一个顶点链,所有边都从左到右指向。 因此,如果我们在顶点vi
那么我们已经考虑了所有通向vi
路径并且具有dist[vi]
的最终值。
时间复杂度:拓扑排序需要O(V+E)
。 在最糟糕的情况下, z
是一个叶子而所有其他顶点都指向它,我们将访问所有图形边缘,给出O(V+E)
。
设f(u)是您在DAG中从c到u的最大利润。 然后你想要计算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.