【问题标题】:Dijkstra's Algorithm using Adjacency Matrix Issue [closed]使用邻接矩阵问题的 Dijkstra 算法 [关闭]
【发布时间】:2012-05-12 12:32:00
【问题描述】:

'正在尝试检索第一个和最后一个节点之间的最短路径。问题是我的代码总是返回 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];
}

【问题讨论】:

  • 您似乎缺少一些代码。也许结束该方法的return 0;?我当然只是在开玩笑,但我在任何地方都看不到退货声明:-/
  • 除了缺少 return 语句以使其实际上无法编译之外,您的代码没有使用 start 参数,因此它不可能区分 start 与任何其他节点。这意味着您在某个时间点比较开始和开始,如果您返回任何内容,则可能是最小距离 0。
  • Appologies,当我复制并粘贴我的代码时,我错过了返回语句。我在之前的尝试中调用该方法时使用了 start 但尚未将其删除。我现在就这样做,因为它是多余的。仅供参考,在之前的尝试中 start 设置为 0。
  • Dijkstra 的算法在没有起始顶点的情况下无法工作
  • 是的,我知道,但不是将起始节点索引传递给方法,而是在我的代码中从零开始。

标签: java algorithm matrix dijkstra adjacency-matrix


【解决方案1】:

我想我可能已经解决了这个问题,通过如下修改代码(我现在传入一个起点而不是硬编码在“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];
}

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

【讨论】:

    【解决方案2】:

    我阅读了您的代码,几乎可以确定它是正确的 dijkstra 算法,所以我认为您的第一个节点和最后一个节点之间的路径可能为零。

    【讨论】:

    • 由于代表人数太少,我无法回答自己的问题,但我已在此处粘贴了我的修复程序。你是对的,因为我设置了 best[0] = 0 它总是返回零,因为它是节点之间的零路径。 pastebin.com/nmp8P1zW
    猜你喜欢
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 2020-09-22
    • 2014-07-12
    • 2021-11-13
    相关资源
    最近更新 更多