Java 图算法:修正最短路径计算程序
修正 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 数组记录每个顶点到起点的最短距离。
参考链接:
原文地址: https://www.cveoy.top/t/topic/oPZe 著作权归作者所有。请勿转载和采集!