在N个步骤内直接绘制非循环图最短路径

我有一个在正向加权有向无环图中找到最短路径的问题,但是有N个步骤的最大数目(路径中的边)的限制。 假定路径存在。 图的附加属性是,如果边(i,j)在图中,那么对于i <k <j,任何边(i,k)也在图中。 我只关心图的开始和结束之间的最短路径(拓扑排序之后)。

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

例如考虑下面的图表。

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


它实际上是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} 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)调用它restore(FINAL_POINT)

链接地址: http://www.djcxy.com/p/35235.html

上一篇: DIrected Acyclic Graph shortest path within N steps

下一篇: finding shortest path in a weighted graph