清华突破计算机科学60年瓶颈,最短路径算法分析 Java实现 小白入手 (六)
·
目录
2. Bellman-Ford算法(单源最短路径,可处理负权边)
2. Bellman-Ford算法(单源最短路径,可处理负权边)
public class BellmanFord {
class Edge {
int src, dest, weight;
Edge() {
src = dest = weight = 0;
}
}
private int V, E;
private Edge[] edges;
BellmanFord(int v, int e) {
V = v;
E = e;
edges = new Edge[e];
for (int i = 0; i < e; ++i)
edges[i] = new Edge();
}
public void bellmanFord(int src) {
int[] dist = new int[V];
Arrays.fill(dist, Integer.MAX_VALUE);
dist[src] = 0;
for (int i = 1; i < V; ++i) {
for (int j = 0; j < E; ++j) {
int u = edges[j].src;
int v = edges[j].dest;
int weight = edges[j].weight;
if (dist[u] != Integer.MAX_VALUE && dist[u] + weight < dist[v])
dist[v] = dist[u] + weight;
}
}
// 检查负权环
for (int j = 0; j < E; ++j) {
int u = edges[j].src;
int v = edges[j].dest;
int weight = edges[j].weight;
if (dist[u] != Integer.MAX_VALUE && dist[u] + weight < dist[v]) {
System.out.println("Graph contains negative weight cycle");
return;
}
}
printArr(dist);
}
private void printArr(int[] dist) {
System.out.println("Vertex Distance from Source");
for (int i = 0; i < V; ++i)
System.out.println(i + "\t\t" + dist[i]);
}
public static void main(String[] args) {
int V = 5;
int E = 8;
BellmanFord graph = new BellmanFord(V, E);
// 添加边
graph.edges[0].src = 0;
graph.edges[0].dest = 1;
graph.edges[0].weight = -1;
graph.edges[1].src = 0;
graph.edges[1].dest = 2;
graph.edges[1].weight = 4;
graph.edges[2].src = 1;
graph.edges[2].dest = 2;
graph.edges[2].weight = 3;
graph.edges[3].src = 1;
graph.edges[3].dest = 3;
graph.edges[3].weight = 2;
graph.edges[4].src = 1;
graph.edges[4].dest = 4;
graph.edges[4].weight = 2;
graph.edges[5].src = 3;
graph.edges[5].dest = 2;
graph.edges[5].weight = 5;
graph.edges[6].src = 3;
graph.edges[6].dest = 1;
graph.edges[6].weight = 1;
graph.edges[7].src = 4;
graph.edges[7].dest = 3;
graph.edges[7].weight = -3;
graph.bellmanFord(0);
}
}
更多推荐

所有评论(0)