编程语言
首页 > 编程语言> > c#-使用Dijkstras查找“ k”最短路径

c#-使用Dijkstras查找“ k”最短路径

作者:互联网

使用Dijkstra的算法wiki Dijkstra’s,我已经可以找到两个顶点之间的最短路径.

但.我的某些边缘被用作“检查点”,因为您必须至少经过一个检查点才能使路由可用.

有时,算法会找到不包含这些边缘检查点的路径.在这种情况下,我想找到第二个.最短路线-如果该路线也不包含检查点,则找到第3条路线.最短的路线,依此类推.

有什么想法可以让我入门吗?

编辑:

是否有可能遍历第一条路线上的所有前任路线,然后从前任路线到目的地运行Dijkstras(并排除前任路线的下一个goto顶点的原始选择).这样,我可能会找到所有可能的路线,然后将它们相互比较?

例.

A =来源
Z =目的地

最短路径:A-> B-> C-> D-> ž

2号最短路径:A-> B-> C-> D-> “成本最低的顶点,不是Z”(如果在当前尝试中找不到所有可用D的邻居,则将其循环通过所有D的未访问邻居)

如果第二.最短路径也不包含检查点,请尝试第3个最短路径

第三名最短路径:A-> B-> C->成本最低的顶点,不是D

还是这种解决方案根本不可能?

编辑2:

可能很难看到,但是紫色的1×3像素是顶点.黄色的道路是边缘,粉红色的3×3像素也是边缘.粉色的也称为检查点.因此,我必须找到最短的路线并至少通过一个检查站.

解决方法:

您可以尝试几种方法来完成这项工作.

让我们将S称为起始节点,将D称为目标节点,将I称为中间节点.

[单个中间节点]
一个简单但次优的解决方案是使用从S到I的Dijkstra,然后将Dijkstra的结果从I附加到D.

[多个中间节点]
正如Niklas B.指出的那样,一种可行的方法是“根据S和D建立最短路径树.对于每个中间节点A,检查d(S,A)d(T,A).最小值为解决方案.运行时为是Dijkstra的两倍,例如具有二进制堆的O((nm)log n)”.

标签:path-finding,dijkstra,c,algorithm
来源: https://codeday.me/bug/20191121/2053115.html