为什么Dijkstra的算法不适用于给定的图形?

时间:2016-12-22 20:05:46

标签: java algorithm dijkstra

我使用Wikipedia's article on the algorithm制作了以下代码,Dijkstra算法。

对于给定的图(见图)和起始节点(1),它返回5作为节点(4)的距离,这显然是假的。但是,当从节点(4)开始时,它返回4作为到(1)的距离,这是正确的。我的代码出了什么问题?

Graph

//source = starting point, adj[] = adjacency list
private static int dijkstra (int source, ArrayList<Road>[] adj) {
    HashSet<Integer> vertices = new HashSet<>();

    int[] dist = new int[adj.length];
    int[] prev = new int[adj.length];

    for (int i = 0; i < adj.length; i++) {
        dist[i] = Integer.MAX_VALUE;
        prev[i] = Integer.MAX_VALUE;
        vertices.add(i);
    }

    dist[source] = 0;

    while (!vertices.isEmpty()) {
        int current = Integer.MAX_VALUE;
        for (int v: vertices) {
            if (dist[v] < current) {
                current = v;
            }
        }
        vertices.remove(current);

        for (Road v: adj[current]) {
            int alt = dist[current] + v.distance;

            if (alt < dist[v.end]) {
                dist[v.end] = alt;
                prev[v.end] = current;
            }
        }
    }
}

class Road {
    int end;
    int distance;
}

//This loop builds adjacency list from input such as "1 3 2", where 1 represents
// starting node, 3 represents end node and 2 represents weight of that edge.
//start and end values are decremented in order to be 0-indexed

for (int i = 0; i < M; i++) {
    int start = in.nextInt() - 1;
    int end = in.nextInt() - 1 ;
    int dist = in.nextInt();

    adj[start].add(new Road(end, dist));
    adj[end].add(new Road(start, dist));
}

1 个答案:

答案 0 :(得分:2)

这段代码导致错误:

int current = Integer.MAX_VALUE;
for (int v: vertices) {
    if (dist[v] < current) {
        current = v;
    }
}

我假设它应该搜索从起始顶点开始具有最短路径的未访问节点。但这看起来应该是这样的:

int currentPathLen = Integer.MAX_VALUE, current = -1;
for (int v: vertices) {
    if (dist[v] < currentPathLen) {
        current = v;
        currentPathLen = dist[current];
    }
}