如何在此图上应用Dijktra算法?

时间:2015-05-09 19:15:22

标签: algorithm graph-algorithm

如何在此图表上应用dijkstra算法? 我一直在努力,但我不知道它会怎么样?

例如,如果我们要找到从a到c的最短路径,那么它不应该是3,因为最短路径从a到b(1)然后b到c(2),所以总共3重量。但是,答案显示4直接从a到c。

这里有任何帮助吗?

enter image description here

1 个答案:

答案 0 :(得分:1)

您以正常方式应用Dijkstra算法,从ac的最短路径实际为3.但是,您应该阅读Dijkstra的pseudocode以了解该表。< / p>

首先,Dijkstra返回一个数组(或另一个数据结构,取决于实现,我们的目的只是说它是一个数组)从一个给定顶点到图中所有顶点的所有最短路径。在这种情况下,如果要使用Dijkstra确定从ac的最短路径,则从a运行它,然后检查返回的数组以查找{{1}的路径}}

该表只显示了c的最短路径的整体计算。它使用类似的符号this video,只是在视频中它们使用数字来标记下一次迭代,这里它使用了从优先级队列中取出的顶点的名称。在伪代码中,您有a。最左边的字母是u ← vertex in Q with min dist[u]。整行只显示最佳值是否发生变化以及是什么。

例如,从ua的路径:在第一次迭代中,我们从c开始寻找邻居。由于a的邻居是a(长度为4的路径),c(长度为1)和b(路径3),我们保存这些值(起始点是d,因此从aa的路径自动为0,a不是e的邻居,因此尚无路径。这是表格的第一行。对于第二次迭代,我们选择a(查看伪代码为什么) - 这是第二行中的第一个字母。现在我们看一下b的邻居,并试着看看我们是否可以改进我们在第一次迭代中标记的一些路径。正如您在图表中看到的那样,我们可以直接从b找到cd的更短路径(不要忘记 - 您需要将{{}的路径相加1}}到a和从a到给定顶点)。仍未找到b,因为它也不是b的邻居。从我们的优先级队列中选择e之后,整个第二行显示了最佳路径。

我们继续直到访问所有顶点并填充表中的所有行。第一个字母仍然是来自伪代码的b(从优先级队列中选择的顶点),而该行的其余部分是该迭代中路径的改进方式。如果你试图在图表上模仿Dijkstra,你会看到它。最后一行也是返回的最短路径数组。

对你的评论(第2行,B到A为0,B到B为1,B到C为3.) - 这是不对的,因为你可以看到从b到{{的最短路径1}}是2(并且无法如何从ub,因此距离将是无穷大)。但是,要看到你需要从c运行Dijkstra作为起始顶点。