单源最短路径 : Bellman-Ford 算法
2013-08-22 16:20
519 查看
public class BellmanFord { static boolean BellmanFord(int[][] graph, char s) { int[] p = new int[graph.length]; int[] dist = new int[graph.length]; for(int i = 0; i < graph.length; i++) { dist[i] = M; p[i] = -1; } int start = s - 'A'; dist[start] = 0; p[start] = -1; //max n-1 edges for(int n = 1; n < graph.length; n++) { for(int i = 0; i < graph.length; i++) { for(int j = 0; j < graph[i].length; j++) { if(dist[j] > (dist[i] + graph[i][j])) { //relaxation dist[j] = (dist[i] + graph[i][j]); p[j] = i; } } } } boolean flag = true; //检查是否含有负权环路 for(int i = 0; i < graph.length; i++) { for(int j = 0; j < graph[i].length; j++) { if(dist[j] > (dist[i] + graph[i][j])) { flag = false; break; } } } //print paths if(flag) { for(int i = 0; i < graph.length; i++) { int j = i; if (dist[j] < M) { System.out.printf("%c -> %c (%d) : ", s, (char)('A' + i), dist[i]); StringBuilder sb = new StringBuilder(); sb.append((char)('A' + j)); while (p[j] != -1) { sb.insert(0, (char) ('A' + p[j]) + " - "); j = p[j]; } System.out.println(sb.toString()); } else { System.out.printf("%c -> %c (∞) : \n", s, (char)('A' + i)); } } } return flag; } static final int M = 10000; //unreachable public static void main(String[] args) { int[][] graph = { {0, 6, 7, M, M}, {M, 0, 8, 5, -4}, {M, M, 0, -3, 9}, {M, -2, M, 0, M}, {2, M, M, 7, 0} }; BellmanFord(graph, 'A'); } }
输出结果:
A -> A (0) : A
A -> B (2) : A - C - D - B
A -> C (7) : A - C
A -> D (4) : A - C - D
A -> E (-2) : A - C - D - B - E
相关文章推荐
- 51nod 1445 变色DNA ( Bellman-Ford算法求单源最短路径)
- 单源最短路径算法 Bellman-Ford && SPFA 及 最短路算法统一归纳
- Bellman-Ford算法之单源最短路径问题
- 图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路);Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;
- 单源最短路径算法 Bellman-Ford && SPFA 及 最短路算法统一归纳
- 单源最短路径算法 Bellman-Ford && SPFA 及 最短路算法统一归纳
- Bellman-Ford 算法 单源最短路径问题
- 图的最短路径算法(四)--Bellman-Ford(解决负权边)单源点最短路径
- 单源最短路径:Dijkstra 算法 Bellman_Ford 算法 SPFA 算法
- 单源最短路径的Bellman-Ford 算法
- 图算法:2、计算带有负权值的单源最短路径:Bellman-Ford算法
- 图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路)Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;
- Bellman-ford算法求解单源点最短路径初始版本
- 单源最短路径之Bellman-Ford 算法
- Bellman-Ford(贝尔曼-福特)算法求单源最短路径
- 求单源最短路径的算法(Bellman-Ford)
- 图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路);Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;
- Bellman-Ford算法 单源最短路径(o(nm))
- 算法导论-第24章- 单源最短路径 - 24.1 Bellman-Ford 算法
- POJ 1860 Currency Exchange Bellman-Ford算法求单源最短路径并判断是否有正权回路