从节点到自身获得最短路径的算法 - 邻接矩阵 - Java

时间:2015-09-22 08:39:19

标签: java algorithm dijkstra directed-graph adjacency-matrix

digraph

digraph

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的算法可以解决这个问题,我采取了错误的方法吗?谢谢!

4 个答案:

答案 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