如何在此图表上应用dijkstra算法? 我一直在努力,但我不知道它会怎么样?
例如,如果我们要找到从a到c的最短路径,那么它不应该是3,因为最短路径从a到b(1)然后b到c(2),所以总共3重量。但是,答案显示4直接从a到c。
这里有任何帮助吗?
答案 0 :(得分:1)
您以正常方式应用Dijkstra算法,从a
到c
的最短路径实际为3.但是,您应该阅读Dijkstra的pseudocode以了解该表。< / p>
首先,Dijkstra返回一个数组(或另一个数据结构,取决于实现,我们的目的只是说它是一个数组)从一个给定顶点到图中所有顶点的所有最短路径。在这种情况下,如果要使用Dijkstra确定从a
到c
的最短路径,则从a
运行它,然后检查返回的数组以查找{{1}的路径}}
该表只显示了c
的最短路径的整体计算。它使用类似的符号this video,只是在视频中它们使用数字来标记下一次迭代,这里它使用了从优先级队列中取出的顶点的名称。在伪代码中,您有a
。最左边的字母是u ← vertex in Q with min dist[u]
。整行只显示最佳值是否发生变化以及是什么。
例如,从u
到a
的路径:在第一次迭代中,我们从c
开始寻找邻居。由于a
的邻居是a
(长度为4的路径),c
(长度为1)和b
(路径3),我们保存这些值(起始点是d
,因此从a
到a
的路径自动为0,a
不是e
的邻居,因此尚无路径。这是表格的第一行。对于第二次迭代,我们选择a
(查看伪代码为什么) - 这是第二行中的第一个字母。现在我们看一下b
的邻居,并试着看看我们是否可以改进我们在第一次迭代中标记的一些路径。正如您在图表中看到的那样,我们可以直接从b
找到c
和d
的更短路径(不要忘记 - 您需要将{{}的路径相加1}}到a
和从a
到给定顶点)。仍未找到b
,因为它也不是b
的邻居。从我们的优先级队列中选择e
之后,整个第二行显示了最佳路径。
我们继续直到访问所有顶点并填充表中的所有行。第一个字母仍然是来自伪代码的b
(从优先级队列中选择的顶点),而该行的其余部分是该迭代中路径的改进方式。如果你试图在图表上模仿Dijkstra,你会看到它。最后一行也是返回的最短路径数组。
对你的评论(第2行,B到A为0,B到B为1,B到C为3.) - 这是不对的,因为你可以看到从b
到{{的最短路径1}}是2(并且无法如何从u
到b
,因此距离将是无穷大)。但是,要看到你需要从c
运行Dijkstra作为起始顶点。