使用 K 个反向边的图中的所有最短路径

All shortest paths in a graph using K reverse edges

假设我有一个具有正整数权重的有向图 G(V,E) edges.What 我需要做的是找到所有顶点之间的最短路径最多使用 K(integer) reverse edges.What 我的意思是 is:If 我们在边 u 并且只有一条从 v 到 u 的有向边 我们可以使用它只要我们没有为此使用 K 个反向边 path.This必须用 C++ 实现并给出最短路径。

我想过 运行 dijkstra V 次(类似于 Johnson 的算法)但我不确定如何利用反向边缘 property.Any 想法?

解决此类问题的常用方法通常描述为 "layering"。你(概念上)制作了 K+1 个图形副本,G0GK,然后连接一个顶点u iGivi+1Gi+1 如果有从 vu 的边在 G.

s0G0[=的路径62=]到tiGi则代表一条从st的路径在G使用i反向边,其中i最多为K.

您可以在这个新的分层图上使用 Dijkstra 算法。

当你习惯了这一点后,你可以用更简单的方式来思考它:你只需使用 Dijkstra 的算法,而不是在队列中有状态 [reached v ,成本 c],您使用 [达到 v,成本 c,已经使用i 反转边缘]。通常,当我们在现实生活中使用 Dijkstra 时,并没有给出实际的图形,因此将其视为对状态及其转换的搜索会有所帮助。