我有一个问题,即在正加权有向无环图中找到最短路径,但是限制了最大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)。
答案 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)