一次改动的最短路径问题

时间:2019-02-25 20:55:18

标签: c++ algorithm

假设我有一个有向图G(V,E)在其边缘具有正整数权重,我需要做的是使用最多K(整数)个反向边缘找到所有顶点之间的最短路径。这就是:如果我们在u边,并且从v到u只有一条有向边,我们可以使用它,只要我们没有为此路径使用K个反向边就必须使用C ++并给出最短的边路径。

我认为解决此问题的主要方法是从概念上创建图的K + 1个副本,其中每个副本具有一个反向边,副本G_0具有一个G_1两个,等等,然后我可以在该图中运行dijkstra并找到最短的从顶点到所有其他顶点的路径,最多使用K条反向边缘。可以执行V次(如johnsons算法)以找到所有可能的最短路径。我的问题是:如何在c ++中实现?我希望我们不会不必创建此多图,但是我看不到如何做。

1 个答案:

答案 0 :(得分:2)

如果您知道Dijkstra,就知道每个顶点都有一个暂定的距离标签(最初是无限的,除了源之外),并且可以通过“松弛”它们的弧线(即更新顶点)来按该暂定距离的顺序处理顶点。邻居的暂定距离。

如果允许许多弧线沿错误的方向传播,我将采用一种动态编程方法,并为每个顶点具有以下语义的K个标签:标签0是经典的Dijstra标签,标签1是具有最多一个反弧的路径上距起点的最小距离,依此类推。

现在,如果我是对的,您要做的就是从无限标签和源标签0开始。加工标签代替圆弧,并且(再次)以最小的试验距离开始。 相对于原始弧,允许放宽反向弧,但会更新弧另一侧的K + 1标签,而放宽沿其法线方向的弧将更新Kth标签。