bellman-ford算法:
遍历所有的边,边有起点i和终点j,如果源点到顶点的最短距离d[i]已经算出来,就比较d[j]和d[i]+distance,如果前者比后者大,就可以更新d[j],如此往复,直到没有数据可更新,这样源点到所有顶点的最短距离就算出来了。
代码实现:
import java.util.Arrays;
public class Main {
static int[][] graph = {
{0, 2, 5, 0, 0, 0, 0},
{2, 0, 4, 6, 10, 0, 0},
{5, 4, 0, 2, 0, 0, 0},
{0, 6, 2, 0, 0, 1, 0},
{0, 10, 0, 0, 0, 3, 5},
{0, 0, 0, 1, 3, 0, 9},
{0, 0, 0, 0, 5, 9, 0}
};
public static void main(String[] args) {
int[] shortestPath = shortestPath(0);
System.out.println(Arrays.toString(shortestPath));
}
private static int[] shortestPath(int s) {
int n = graph.length;
int[] d = new int[n];
for (int i = 0; i < n; ++i) {
d[i] = Integer.MAX_VALUE;
}
d[s] = 0;
while (true) {
boolean update = false;
for (int i = 0; i < n; ++i) {
if (d[i] == Integer.MAX_VALUE) {
continue;
}
for (int j = 0; j < n; ++j) {
int distance = graph[i][j];
if (distance > 0) {
if (d[j] > d[i] + distance) {
update = true;
d[j] = d[i] + distance;
}
}
}
}
if (!update) {
break;
}
}
return d;
}
}
运行结果截图: