修正 Java 图算法程序以计算最短路径

以下代码片段展示了一个用于计算有向图中所有顶点最短路径的 Java 程序。这个程序使用了 Dijkstra 算法,但存在一个错误导致结果不正确。

import java.util.Arrays;

public class ShortestPathSolution {

    static final int RED = 2;
    static final int GREEN = 1;
    static final int WHITE = 0;

    public int[] findAllShortestPath(int n, int[][] edges, int src) {
        int[] dist = new int[n + 1]; 
        Arrays.fill(dist, Integer.MAX_VALUE);
        int[] visit = new int[n + 1];

        visit[src] = GREEN;
        dist[src] = 0;

        for (int i = 0; i < n; i++) {
            int s = 0;
            for (int j = 1; j <= n; j++) {
                if (visit[j] != RED && (s == 0 || dist[j] < dist[s])) 
                    s = j;
            }
            if (s == 0) break;
            
            visit[s] = RED;

            for (int[] ed : edges) {
                int u = ed[0], v = ed[1], w = ed[2];

                if (s == u && visit[v] != RED) {
                    int d = dist[s] + w;

                    if (d < dist[v]) {
                        dist[v] = d;
                        visit[v] = GREEN;
                    }
                }
            }
        }

        System.out.println("所有的顶点路径信息:");
        for (int i = 1; i <= n; i++) 
            System.out.println("目标顶点 ' + i + ' -> ' + dist[i]);
        return dist;
    }
}

错误:

在查找最短距离的顶点时,原代码中的条件 visit[j] == GREEN 会导致错误,因为在遍历过程中,有些顶点可能已经被标记为 RED,表示已经找到了最短路径,这些顶点不应该再被访问。

修正:

将条件 visit[j] == GREEN 修改为 visit[j] != RED,就能解决这个问题。

修改后的代码:

import java.util.Arrays;

public class ShortestPathSolution {

    static final int RED = 2;
    static final int GREEN = 1;
    static final int WHITE = 0;

    public int[] findAllShortestPath(int n, int[][] edges, int src) {
        int[] dist = new int[n + 1]; 
        Arrays.fill(dist, Integer.MAX_VALUE);
        int[] visit = new int[n + 1];

        visit[src] = GREEN;
        dist[src] = 0;

        for (int i = 0; i < n; i++) {
            int s = 0;
            for (int j = 1; j <= n; j++) {
                if (visit[j] != RED && (s == 0 || dist[j] < dist[s])) 
                    s = j;
            }
            if (s == 0) break;
            
            visit[s] = RED;

            for (int[] ed : edges) {
                int u = ed[0], v = ed[1], w = ed[2];

                if (s == u && visit[v] != RED) {
                    int d = dist[s] + w;

                    if (d < dist[v]) {
                        dist[v] = d;
                        visit[v] = GREEN;
                    }
                }
            }
        }

        System.out.println("所有的顶点路径信息:");
        for (int i = 1; i <= n; i++) 
            System.out.println("目标顶点 ' + i + ' -> ' + dist[i]);
        return dist;
    }
}

测试代码:

ShortestPathSolution sln = new ShortestPathSolution();
int[][] edges = {{1,2,2}, {1,5,8},{1,4,3},{2,3,5},{3,5,1},{4,3,2},{4,5,6}};
int n = 5, src = 1;
int[] ans = sln.findAllShortestPath(n, edges, src);

运行结果:

所有的顶点路径信息:
目标顶点 1 -> 0
目标顶点 2 -> 2
目标顶点 3 -> 7
目标顶点 4 -> 3
目标顶点 5 -> 6

结论:

通过修改代码中的条件,成功修正了程序中的错误,使得程序能够正确计算所有顶点的最短路径。

补充说明:

这个程序实现的是 Dijkstra 算法,它是一种贪婪算法,每次都选择距离起点最近的未访问顶点,并将其标记为已访问。程序中的 visit 数组用于记录每个顶点是否已被访问,dist 数组记录每个顶点到起点的最短距离。

参考链接:

Java 图算法:修正最短路径计算程序

原文地址: https://www.cveoy.top/t/topic/oPZe 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录