使用邻接矩阵问题的Dijkstra算法

时间:2012-05-03 01:07:20

标签: 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.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];
}

2 个答案:

答案 0 :(得分:3)

我想我可能已经解决了这个问题,通过如下修改代码(我现在在起点而不是硬编码的&#34; 0&#34;):

    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循环运行此代码并且瞧...不仅仅是零现在返回。

答案 1 :(得分:1)

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