修改广度优先搜索算法以记住矩阵中的最短路径

Posted

技术标签:

【中文标题】修改广度优先搜索算法以记住矩阵中的最短路径【英文标题】:Modifying the Breadth First Search algorithm to remember the shortest route in a matrix 【发布时间】:2017-03-20 06:52:55 【问题描述】:

我正在尝试使用广度优先搜索算法找到两个给定城市之间的最短路径。然后我希望能够打印出该路径。我有一个存储在多维数组(数组 [8] [8])中的城市矩阵。矩阵如下所示:

    #1    #2     #3       #4     #5    #6        #7   #8
#1   0    100    -1       10     -1    -1        -1   100
#2  100     0    -1       -1     10    10        -1    -1
#3  -1     -1     0     1000    100    -1      1000    -1
#4  50     -1   720       -1    -1     -1       -1     -1  
#5  -1     10   100       -1      0    -1       100    -1
#6  -1     10    -1       -1     -1     0        50  2000
#7  -1     -1  1000       -1    100    10         0    -1
#8  100    -1    -1       -1     -1  1000        -1     0

如果数字大于 0,则表示这两个城市之间存在路径。例如,城市 #2 有一条通往城市 #1 的路径,因为它的编号为 100。我需要找到从给定源城市到目的地城市的最短路径。

我的问题是,是否可以修改广度优先搜索算法以在矩阵上执行此操作,还是应该将数据存储在另一个数据结构中?

【问题讨论】:

找到最短路径的BFS变种称为Dijkstra算法,查一下。 Dijkstra 算法用于单源所有目的地的最短路径,而不仅仅是特定节点。这有利于获得到所有其他节点的最短路径。 【参考方案1】:

您需要使用 Node 类,该类具有您正在查看的当前节点的属性,并且它是父节点,而不仅仅是原始节点。因此,当您找到连接到当前节点的所有节点时,为子节点创建一个新对象,并将 parent 属性设置为您的当前节点。

然后,一旦您找到了最短路径,您将遍历父属性,直到到达根(其父级为空)。

这就是简单的解释(我说“节点”的次数够多了吗?)...希望它有意义。

【讨论】:

感谢您为我指明了正确的方向。我一直在试图弄清楚如何将数据从我的多维数组传输到 Node 类,我只是无法弄清楚 Node 类到底是什么。

以上是关于修改广度优先搜索算法以记住矩阵中的最短路径的主要内容,如果未能解决你的问题,请参考以下文章

算法图解:广度优先搜索

每天学习一点儿算法--广度优先搜索

原创教程数据结构与算法——广度与深度优先搜索

最短路径问题与广度优先搜索

搜索带权图最短路径的Dijkstra算法

算法广度优先搜索