使用 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 个图形副本,G0 到 GK,然后连接一个顶点u i 在 Gi 到vi+1 在 Gi+1 如果有从 v 到 u 的边在 G.
从s0到G0[=的路径62=]到ti在Gi则代表一条从s到t的路径在G使用i反向边,其中i最多为K.
您可以在这个新的分层图上使用 Dijkstra 算法。
当你习惯了这一点后,你可以用更简单的方式来思考它:你只需使用 Dijkstra 的算法,而不是在队列中有状态 [reached v ,成本 c],您使用 [达到 v,成本 c,已经使用i 反转边缘]。通常,当我们在现实生活中使用 Dijkstra 时,并没有给出实际的图形,因此将其视为对状态及其转换的搜索会有所帮助。
假设我有一个具有正整数权重的有向图 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 个图形副本,G0 到 GK,然后连接一个顶点u i 在 Gi 到vi+1 在 Gi+1 如果有从 v 到 u 的边在 G.
从s0到G0[=的路径62=]到ti在Gi则代表一条从s到t的路径在G使用i反向边,其中i最多为K.
您可以在这个新的分层图上使用 Dijkstra 算法。
当你习惯了这一点后,你可以用更简单的方式来思考它:你只需使用 Dijkstra 的算法,而不是在队列中有状态 [reached v ,成本 c],您使用 [达到 v,成本 c,已经使用i 反转边缘]。通常,当我们在现实生活中使用 Dijkstra 时,并没有给出实际的图形,因此将其视为对状态及其转换的搜索会有所帮助。