找到两个节点(顶点)之间的最短路径

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。已经针对您的需要实施了一些有趣的算法,您可以选择最适合的。

【讨论】:

以上是关于找到两个节点(顶点)之间的最短路径的主要内容,如果未能解决你的问题,请参考以下文章

求有向图两个顶点间的最短路径的方法,用简单语言或举例描述。

MySQL两个节点之间的最短路径

用Dijkstra算法求图中从顶点a到其他各顶点间的最短路径,并写出执行算法过程中各步的状态。

两个节点之间所有最短路径列表中的最大值

最短路径

具有动态边缘成本的最短路径(算法)