使用 Dijkstra 计算的算法

Posted

技术标签:

【中文标题】使用 Dijkstra 计算的算法【英文标题】:An algorithm using Dijkstra to calculate 【发布时间】:2021-12-24 05:27:16 【问题描述】:

给定一个有向图 G = (V, E),边权重为 w:E 到 R+。

该图表示布鲁克林的道路,每条边上的权重表示道路的长度(以英里为单位)。奖品放置在节点 t(在 V 中)。给定的是V中的一组节点A(A是V的一个子集),以及一个函数s:A到R+。

在 A 中的每个 v 中都有一个玩家。游戏开始时,所有玩家同时离开,前往奖品。

每个玩家都沿着从其起始节点到 t 的最短路径前进。离开节点 v 的玩家以恒定速度 s(v) 前进, 即,对于 E 中的每个 e,该玩家需要 w(e)/s(v) 时间单位才能过马路 e。

建议一种返回获胜者的有效算法。


我的尝试:

算法:

    在 A 中的某个节点 v 上运行 Dijkstra,并启动一个大小为 |A| 的数组(每个玩家)。 对于 A 中的每个 v,迭代从 v 到 t 的最短路径,并在每次迭代中将 w(e)/s(v) 添加到数组中此特定节点的总和。 返回数组的最小值。

我认为这可以改进,例如将数组替换为其他数据结构,这将使最后一步更有效率,但我不知道如何。

我将不胜感激!

谢谢!

【问题讨论】:

【参考方案1】:

您可以通过从目标节点t 运行一次 Dijkstra 算法来计算所有往返 t 的最短路径。您正在寻找Distance(a, t) / Speed(a) 的最小值,在所有a ∈ A 中,其中距离是来自 Dijkstra 算法的标准边权重总和。由于原始图是有向图,因此您需要先反转所有边的方向并处理该图。

如果“A”很小,您偶尔可以通过在访问 A 中的所有节点后立即停止 Dijkstra 算法来稍微优化它,尽管最坏情况的运行时间是相同的。

【讨论】:

如果没有从 t 到其他人的边会怎样?这是一个有向图,每条边都可以指向 t 而不是来自它。 感谢您的回答!在这种情况下,您是否需要翻转 G 中的边缘才能在 t 上执行 Dijkstra? @Math4me 感谢您的关注;我错过了有向图的细节。在这种情况下,您确实需要先翻转所有边并处理该图。

以上是关于使用 Dijkstra 计算的算法的主要内容,如果未能解决你的问题,请参考以下文章

Dijkstra算法

使用 Dijkstra 计算的算法

计算图的最短距离--Dijkstra算法

Dijkstra算法

Dijkstra算法详细(单源最短路径算法)

用C++求dijkstra算法求最短路径