无向图上的最短路径?


19

所以我认为这个(虽然有些基本)问题属于这里:

假设我有一个大小为100的节点的图,以10x10的模式排列(请考虑棋盘)。该图是无向的和未加权的。在图形中移动涉及向前移动三个空间,向右或向左移动一个空间(类似于国际象棋骑士在棋盘上的移动方式)。

给定一个固定的开始节点,人们将如何找到通往板上其他任何节点的最短路径?

我以为可行的移动节点之间只有一条边。因此,鉴于此信息,我希望找到从起始节点到结束节点的最短路径。

我最初的想法是每条边的权重均为1。因此,我决定使用深度优先搜索的更改形式来进行此操作。

但是,我无法终生想象如何使用搜索获得最短路径。

我尝试的另一件事是将图以树形图作为起始节点作为根,然后选择最浅的(最低的行号)结果,该结果为我提供了所需的结束节点……这是可行的,但是效率极低,因此不适用于较大的图形。

有没有人有任何想法可以为我指出正确的方向?

非常感谢你。

(我试图对图表进行可视化处理,但由于声誉低下而无法执行)

Answers:


19

如果图中的边缘仅表示特定位置之间的有效移动,则使用Dijkstra的方法就可以了。但是,由于该图未加权,因此会过分杀伤力。简单的广度优先搜索将给出最佳答案。


哦,我什至没有想到BFS!万分感谢!
gfppaste 2012年

怎么杀了?可能实现起来有点困难。

我还要补充一点,BFS效率更高。BFS有O(|E|),而Dijkstra有O(|E| + |V|log(|V|)
Doug Ramsey

@ user742 BFS比Djikstras快。Djikstra O(mn)在BFS期间O(V + E)
CodyBugstein 2014年

13

尼古拉斯已经提供了一个完美的答案。但是,让我解决您最初使用深度优先搜索的尝试。

首先,Dijkstra(与Nicholas Mancuso指出的未加权节点配合使用时效果很好)或广度优先搜索会导致内存成倍的浪费。但是,它们的优势在于,在保证找到最佳解决方案的同时,它们从不重新扩展任何节点。不幸的是,它们的局限性非常重要,不应期望它们会合理扩大规模。

dmaxkidmax+i×kdmax=k=1 那么当您在解决方案的深度使用线性内存时,可以保证找到最佳解决方案。

bb1b

干杯,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.