使用 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 计算的算法的主要内容,如果未能解决你的问题,请参考以下文章