最短路径算法是指在一个有向加权图中,找出从起点到终点的最短路径。常见的解决方案有两种:Dijkstra算法和Bellman-Ford算法。
Bellman-Ford算法
Bellman-Ford算法是一种动态规划算法,它通过逐步增加路径长度的限制,来逐步缩小最短路径的范围。在每次更新时,对所有的边进行松弛操作,更新它们到起点的距离值。如果在第$n$次更新时,仍然存在松弛的情况,则说明存在负环,没有最短路径。
下面是Bellman-Ford算法的Java实现:
public class BellmanFord {
public static int shortestPath(int[][] graph, int source, int target) {
int n = graph.length;
int[] dist = new int[n];
Arrays.fill(dist, Integer.MAX_VALUE);
dist[source] = 0;
for (int i = 0; i < n - 1; i++) {
for (int u = 0; u < n; u++) {
for (int v = 0; v < n; v++) {
if (graph[u][v] != 0) {
int newDist = dist[u] + graph[u][v];
if (newDist < dist[v]) {
dist[v] = newDist;
}
}
}
}
}
for (int u = 0; u < n; u++) {
for (int v = 0; v < n; v++) {
if (graph[u][v] != 0) {
int newDist = dist[u] + graph[u][v];
if (newDist < dist[v]) {
return -1;
}
}
}
}
return dist[target];
}
}