找到两个节点(顶点)之间的最短路径
Posted
技术标签:
【中文标题】找到两个节点(顶点)之间的最短路径【英文标题】:Find the shortest Path between two nodes (vertices) 【发布时间】:2009-11-02 05:30:41 【问题描述】:我有一个相互连接的边列表 (E
),我如何找到从一个顶点连接到另一个顶点的最短路径?
我正在考虑使用lowest common ancestors,但边缘没有明确定义的根,所以我认为该解决方案行不通。
最短路径由遍历的最小顶点数定义。
注意:可能存在连接两个顶点的多路径,因此显然广度优先搜索不起作用
【问题讨论】:
请注意,最低的共同祖先需要一棵树,这意味着任何两个节点之间只有一条路径。在这种情况下,找到最短路径是微不足道的。 我不明白使用 BFS 有多条可能的路径是如何失败的。 BFS 从图中的单个节点找到最短路径,前提是所有边都未加权/具有相同的权重。该图不必是 BFS 工作的树。 【参考方案1】:Dijkstra 的算法会为您做到这一点。
【讨论】:
仅当边缘被加权时才需要。 我忘了...我以为他的边图是权重。 如果没有加权,简单地假设所有边的权重为 1。仍然是一个很好的解决方案。【参考方案2】:我不确定您是否需要在每对 对节点之间或在两个特定 节点之间设置路径。既然有人已经给出了针对前者的答案,我将针对后者。
如果您对图表没有任何先验知识(如果有,您可以使用基于启发式的搜索,例如A*),那么您应该使用breadth-first search。
【讨论】:
bfs 会告诉我两个节点之间的路径;但它不能告诉我哪条路径最短。 糟糕,BFS 为您提供了未加权边缘的最短路径。【参考方案3】:Floyd-Warshall 算法可能会解决您的问题,但也有other solutions 可以解决所有对最短路径问题。
【讨论】:
【参考方案4】:Shortest path is defined by the minimum number of vertexes treversed
等于最小边数加一。
您可以使用标准广度优先搜索,它会正常工作。如果您有多个连接两个顶点的路径,只需保存其中一个,它不会影响任何事情,因为每条边的权重都是 1。
【讨论】:
【参考方案5】:额外 2 美分。看看networkx。已经针对您的需要实施了一些有趣的算法,您可以选择最适合的。
【讨论】:
以上是关于找到两个节点(顶点)之间的最短路径的主要内容,如果未能解决你的问题,请参考以下文章