在N步骤内的DIrected非循环图最短路径

时间:2017-02-05 18:41:49

标签: algorithm graph shortest-path directed-acyclic-graphs

我有一个问题,即在正加权有向无环图中找到最短路径,但是限制了最大N步数(路径中的边)。假设路径存在。该图的附加属性是如果边(i,j)在图中,那么任何边(i,k)也在图中,对于i <1。 k&lt;学家我只对图的开始和结束之间的最短路径感兴趣(在拓扑排序之后)。

我知道O(V + E)中有向无环图中的最短路径有一种有效算法,但它没有考虑步长限制。我想不出任何方法可以使它成为O((V + E)* N),但这将是理想的性能,因为它应该足以处理1000个节点和100个步骤的图形。

例如,请考虑以下内容 graph

问题是找到最多使用k = 3步(边)的最短路径。答案是6(路径1-> 4-> 5-> 6)。

1 个答案:

答案 0 :(得分:0)

实际上是O(N + M),其中N是顶点数,M是边数。 您可以在此处找到更多信息:http://www.geeksforgeeks.org/shortest-path-for-directed-acyclic-graphs/

找到路径(我使用geeksforgeeks的代码): 而不是int dist[V]使用pair<int, int> dist[V]。最初是dist[S] = {0, -1}。因此,在此条件if (dist[i->getV()].first > dist[u].first + i->getWeight())中,您需要将父级设置为dist[i->getV()] = {dist[u].first + i->getWeight(), u}

然后使用此递归代码恢复路径:

void restore(int v) { 
   if(dist[v].second == -1) return;
   else answer.push_back(v);
   if(v == START_POINT) return;
   restore(dist[v].second);
}

使用restore(FINAL_POINT)

进行调用