Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 迪克斯特拉';利用邻接矩阵问题的s算法_Java_Algorithm_Matrix_Dijkstra_Adjacency Matrix - Fatal编程技术网

Java 迪克斯特拉';利用邻接矩阵问题的s算法

Java 迪克斯特拉';利用邻接矩阵问题的s算法,java,algorithm,matrix,dijkstra,adjacency-matrix,Java,Algorithm,Matrix,Dijkstra,Adjacency Matrix,'我正在尝试检索第一个节点和最后一个节点之间的最短路径。问题是我的代码总是返回0。我有一种感觉,这是因为它计算的是第一个节点和第一个节点之间的距离,它将为零,但我不是100%。为什么我的代码总是返回0 adj矩阵为[10][10],所有节点均已连接,g.network[][]为矩阵 private static int dijkstras(Graph g) { // Dijkstra's Algorithm int[] best = new int[g.network.lengt

'我正在尝试检索第一个节点和最后一个节点之间的最短路径。问题是我的代码总是返回0。我有一种感觉,这是因为它计算的是第一个节点和第一个节点之间的距离,它将为零,但我不是100%。为什么我的代码总是返回0

adj矩阵为[10][10],所有节点均已连接,g.network[][]为矩阵

private static int dijkstras(Graph g) {
    // Dijkstra's Algorithm
    int[] best = new int[g.network.length];
    boolean[] visited = new boolean[g.network.length];
    int max = 10000; // Infinity equivalent.
    for (int i = 0; i < g.network.length; i++)
    {
        best[i] = max;
        visited[i] = false;
    }

    best[0] = 0;

    for(int i = 0; i < g.network.length; i++)
    {
        int min = max;
        int currentNode = 0;
        for (int j = 0; j < g.network.length; j++)
        {
            if (!visited[j] && best[j] < min)
            {
                currentNode = j;
                min = best[j];
            }
        }
        visited[currentNode] = true;
        for (int j = 0; j < g.network.length; j++)
        {
            if (g.network[currentNode][j] < max && best[currentNode] + g.network[currentNode][j] < best[j])
            {
                best[j] = best[currentNode] + g.network[currentNode][j];
            }
        }
    }
            return best[g.network.length - 2];
}
private static int dijkstras(图g){
//Dijkstra算法
int[]最佳=新int[g.network.length];
boolean[]访问=新的boolean[g.network.length];
int max=10000;//等于无穷大。
for(int i=0;i
我阅读了您的代码,我几乎肯定它是正确的dijkstra算法,因此我认为您的第一个节点和最后一个节点之间可能有一个零路径。

我认为我可能已经解决了这个问题,通过如下修改代码(我现在传递的是一个起点,而不是硬编码的“0”):

private static int dijkstras(图g,int start)//添加了一个起点。
{
//Dijkstra算法
int[]最佳=新int[g.network.length];
boolean[]访问=新的boolean[g.network.length];
int max=10000;//等于无穷大。
for(int i=0;i

我通过for循环运行了这段代码,瞧……现在返回的不仅仅是零。

您似乎缺少一些代码。可能
返回0该方法结束了吗?当然,我只是在开玩笑,但我在任何地方都看不到return语句:-/除了缺少return语句使其实际上无法编译之外,您的代码没有使用
start
参数,因此它不可能将start与任何其他节点区分开来。这意味着您正在比较开始与开始之间的距离,如果您返回了任何内容,则可能是最小距离0。同理,当我复制并粘贴代码时,我错过了返回语句。我在上一次尝试调用该方法时使用了start,但尚未将其删除。既然那是多余的,我现在就去做。仅供参考,在以前的尝试中,start设置为0。Dijkstra的算法在没有起始顶点的情况下无法工作。是的,我知道,但不是将起始节点索引传递到方法中,而是在我的代码中从零开始。我无法回答我自己的问题,因为代表性较低,但我已将我的修复粘贴在此处。您是对的,因为我将best[0]=0设置为它总是返回零,因为它是节点之间的零路径。
    private static int dijkstras(Graph g, int start) // Added a start point.
    {
    // Dijkstra's Algorithm
    int[] best = new int[g.network.length];
    boolean[] visited = new boolean[g.network.length];
    int max = 10000; // Infinity equivalent.
    for (int i = 0; i < g.network.length; i++)
    {
        best[i] = max;
        visited[i] = false;
    }

    best[start] = start; // Changed the 0 to variable start.

    for(int i = 0; i < g.network.length; i++)
    {
        int min = max;
        int currentNode = 0;
        for (int j = 0; j < g.network.length; j++)
        {
            if (!visited[j] && best[j] < min)
            {
                currentNode = j;
                min = best[j];
            }
        }
        visited[currentNode] = true;
        for (int j = 0; j < g.network.length; j++)
        {
            if (g.network[currentNode][j] < max && best[currentNode] +   g.network[currentNode][j] < best[j])
            {
                best[j] = best[currentNode] + g.network[currentNode][j];
            }
        }
    }
            return best[g.network.length - 2];
}