import java.util.*;
public class forLoop1{
public static void main(String args[]){
Scanner input=new Scanner(System.in);
System.out.println("Enter the number:");
int x=input.nextInt();
int finalint=1;
for( int init=1;init<=x;init++){
finalint=finalint*init;
}
}
}
这个Dijkstra算法可以正常工作。但是,它仅适用于顶点&#39; x&#39;到顶点&#39; y。对于我的生活,我无法弄清楚如何从顶点找到最短的路径&#39; x&#39;到顶点&#39; x&#39;。
例如:
从B到B,最短路径应返回9(B→C - > E - > B)。我认为Dijkstra的算法可以解决这个问题,我采取了错误的方法吗?谢谢!
答案 0 :(得分:4)
您可以从与x相邻的节点开始搜索最短路径,然后搜索到节点x。
最短路径是从x到相邻节点的路径长度加上从该相邻节点到x的最短路径长度的最短和。
基本上是伪代码:
// Note: The function neighbors(x) returns the list of neighbors of node x
// The function distance(x, y) returns distance between node x and y
// applying dijkstra algorithm
shortestDistance = 0;
for (Node neighbor : neighbors(x)) {
currentDistance = distance(x, neighbor) + distance(neighbor, x);
shortestDistance = min(currentDistance, shortestDistance);
}
return shortestDistance;
答案 1 :(得分:1)
为每个起始节点运行Dijkstra以计算所有对最短路径。然后,您可以通过遍历相邻节点并添加此边缘权重来计算自己最短路径。在某些情况下,最短路径将是无穷大,具体取决于节点的入度。
答案 2 :(得分:1)
这是一种从一个节点到自身找到最短路径的棘手方法 具有非负权重的有向图,将该节点(比如s)分成两个节点s和s',额外的一个s'被认为是虚拟的,如果s具有自循环则构建具有相同权重的双向边缘,并且还复制所有涉及s'的边缘,即用s'代替s。然后问题就是找到从s'到s的最短路径。您只需要稍微修改Dijkstra的算法来实现这个想法。只是改变初始化。而不是设置d [s] = 0而所有其他都是无穷大,为s的每个相邻节点设置d [u] = w(s,u)。
答案 3 :(得分:0)
网格中两个节点之间的最短路径可以由Manhattan distance
曼哈顿距离:
基于严格的网格中两点之间的距离 水平和/或垂直路径(即沿网格线),如 反对对角线或“像乌鸦飞行”的距离。曼哈顿 距离是水平和垂直分量的简单总和, 而对角线距离可以通过应用来计算 毕达哥拉斯定理。
Source
现在,如果您希望将其应用于寻找最短路径,请阅读Heuristics
,更具体地说是A* Algorithm
。
也许这个问题和anwser可能对您有用:A* Algorithm with Manhattan Distance Heuristic