shortest-path - SSSP 算法:最小距离但在一定数量的“跳”下
问题描述
给定一个有向加权图(没有负边),从一个节点到另一个节点的最短距离是多少,它也满足从一个节点/顶点到另一个节点/顶点的“跳数”必须小于某个值 k 的条件. (其中 k 肯定小于节点数)。
一个“跳”被定义为从一个节点移动到另一个节点,并且“跳”值从源节点开始为 1。
问题并不像简单地运行 Dijkstra 算法那么简单,因为该算法只为您提供最短距离,而不考虑“跳数”。
考虑 1:从源到端节点的最短路径可能超过允许的最大“跳数”。
考虑 2:增强 Dijkstra 算法以最小化“跳数”的数量会给你一个可能的答案,但它可能不是最短的。
注意这里的优先级仍然是最小化最短距离,只是有一个“跳数”需要小于某个值的新条件。
解决方案
有一种解决方案可以针对您的特定情况修改 Bellman-Ford 算法。在经典的 Bellman-Ford ( https://en.wikipedia.org/wiki/Bellman%E2%80%93Ford_algorithm ) 上,您应该进行 N 次迭代。
解决方案的思路如下,
为每个其他节点设置距离[root] = 0,距离 [x] = 无穷大。
现在,我们将遍历所有边并尝试改进我们的答案。
For Edge in Edges:
distance[Edge.dest] = min( distance[Edge.dest], distance[Edge.src] + Edge.cost)
应用此步骤一次将为我们提供从原点到最多使用一条边的最短路径。现在的想法是准确地重复此步骤 K 次。这将为我们提供从原点到使用最多 K 条边的每个其他节点的最短路径。
复杂度: O( K * |edges| )
推荐阅读
- angular - Angular dev bulild 从 URL 中删除/删除散列之前的参数
- spring-boot - 如何查找两个日期时间之间新添加/修改的节点/关系
- angularjs - AngularJS a.map 不是 AJAX 发布调用期间的函数
- asp.net-mvc - Asp.net MVC-无法将值绑定到多选
- java - 当 split() 函数将字符串正确拆分为模式时,为什么 matches() 函数返回 false ?
- angular - 我想只使用一个输入字段以 6 角形式创建一个单选按钮
- java - 使用 Gson 自定义 Json 序列化
- jquery - 固定侧边栏菜单不跳转到正确的位置
- java - 与集合和泛型相关的 Java 10 迁移问题
- python - 在大型 ZIP 文件中导入 Python 包