【问题标题】:Finding the closest marked node in a graph在图中查找最近的标记节点
【发布时间】:2017-12-20 10:34:06
【问题描述】:

在一个有一堆普通节点和几个特殊标记节点的图中,是否有一种通用算法可以找到距离图中给定起始位置最近的标记节点?

或者是进行 BFS 搜索以找到标记节点然后在每个发现的标记节点上执行 Dijkstra 以查看哪个最接近的最佳方法?

【问题讨论】:

  • 您能否在问题中添加更多详细信息?图是有向的吗?也许您有一个不变(或很少变化)的图表和许多查询?或者您每次都有新的问题实例?你对标记顶点的数量有什么限制吗?
  • 您能否定义“最接近”。空间最近、网络跳数最少、网络距离最短还是其他?
  • @SaiBot 更接近我的意思是必须从起始节点穿过最少边的节点。

标签: algorithm graph graph-algorithm shortest-path


【解决方案1】:

这取决于图表,以及您对“最接近”的定义。

如果您计算“最接近”而忽略边权重,或者您的图没有边权重,则简单的广度优先搜索 (BFS) 就足够了。根据 BFS 的定义,通过 BFS 到达的第一个节点是最接近的(或者,如果有几个最近的节点,则为接近度并列)。如果您跟踪扩展 BFS 级别的数量,您可以通过到达级别的末尾来定位所有最近的节点,而不是在找到第一个标记的节点时立即停止。

如果您有边权重,并且需要在计算中使用它们,请改用 Dijkstra。如果边可以有负权重,并且碰巧有任何负循环,那么您将需要使用 Bellman-Ford。

正如SaiBot 所提到的,如果起始节点始终相同,并且您将使用更改的“标记”节点执行多个查询,那么有更快的方法来做事。特别是,您可以在每个节点中存储在第一次完整遍历中找到的“父节点”,以及节点到起始节点的距离。添加一批新的 k 个标记节点时,通过查看每个标记节点的距离,您会立即知道距离起点最近的节点。

【讨论】:

  • 如果你添加一个常数,Dijkstra 将无法处理负边
  • @tucuxi 是的,该图将未加权。在这种情况下如何使用 BFS?它会在找到一个标记节点后立即停止,因为那将是最近的节点,对吧?
  • 如果您有启发式,您还可以通过将启发式设置为所有端节点的最小值来使用 A*。
  • @noJS 谢谢,我已经很长时间没有阅读理论了,现在我正在纠正我的答案。是贝尔曼福特!
  • @JohnSlaine 澄清了 BFS 的答案。是的,找到的第一个是最接近的(或并列的)。如果您跟踪关卡(= 从开始跳跃)并完成关卡,您可以找到所有最近的标记节点。
【解决方案2】:

最快的方法是立即从您的起始位置(起始节点)执行 Dijkstra。当“接近度”定义为必须遍历的边数时,您只需为每条边分配权重 1。如果允许进行预计算,将会有更快的方法来做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-18
    • 2020-03-31
    • 2011-02-21
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    相关资源
    最近更新 更多