/** DijkstraAlgorithm(带权简单图 digraph, 顶点 first) { 说明: import java.util.Arrays; public class Dijkstra { @param v in the source vertex
for (int i = 0; i < n; i++) { private static void test() {
int[][] matrix = {{0, 10, Integer.MAX_VALUE, 30, 100} , {Integer.MAX_VALUE, 0, 50, Integer.MAX_VALUE, Integer.MAX_VALUE} , {Integer.MAX_VALUE, Integer.MAX_VALUE, 0, Integer.MAX_VALUE, 10} , {Integer.MAX_VALUE, Integer.MAX_VALUE, 20, 0, 60} , {Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, 0} }; int v = 0; int[] dist = new int[matrix.length]; int[] prev = new int[matrix.length]; dijkstra(v, matrix, dist, prev); System.out.println(Arrays.toString(dist)); System.out.println(Arrays.toString(prev)); } public static void main(String[] args) { test(); } } /**
二.第一个纠正标记算法是由 Lester Ford 设计的。 它在整个图处理完成之前不会永久性确定任何节点的最短距离。 它比 Dijkstra 算法功能更强,因为它可以处理带负权的图(但不能是有负环的图)。 labelCorrectingAlgorithm(带权简单图 digraph, 顶点 first) {
for 所有顶点 v currDist(v) = 无穷大; currDist(first) = 0; toBeChecked = {first}; while toBeChecked 非空 { v = toBeChecked中的一个顶点; 从 toBeChecked 中删除 v; for 所有和 v 邻接的顶点 u { if currDist(u) > currDist(v) + weight(edge(vu)) { currDist(u) = currDist(v) + weight(edge(vu)); predecessor(u) = v; 如果 u 不属于 toBeChecked ,就把它添加进去; } //end if } //end for } //end while } //end algorithm 说明:算法的具体实例效率要根据toBeChecked表使用的数据结构以及从这个表抽取元素和插入元素的操作来确定
**/ import java.util.*; public class LabelCorrectingShortestPathAlgorithm {
public static void labelCorrectingShortestPathAlgorithm(int first, int[][] matrix, int[] currDist, int[] predecessor) {
int n = currDist.length; for (int i = 0; i < n; i++) { currDist[i] = Integer.MAX_VALUE; } currDist[first] = 0; List<Integer> toBeChecked = new LinkedList<Integer>(); toBeChecked.add(first); while (!toBeChecked.isEmpty()) { int v = toBeChecked.get(0); toBeChecked.remove(0); for (int i = 0; i < n; i++) { if (i != v && matrix[v][i] < Integer.MAX_VALUE) { //所有和v邻接的顶点i if (currDist[i] > currDist[v] + matrix[v][i]) { currDist[i] = currDist[v] + matrix[v][i]; predecessor[i] = v; if (toBeChecked.indexOf(i) == -1) { //如果i不在toBeChecked中,则把它加进去 toBeChecked.add(i); } } } } } } private static void test() {
int[][] matrix = {{0, 10, Integer.MAX_VALUE, 30, 100} , {Integer.MAX_VALUE, 0, 50, Integer.MAX_VALUE, Integer.MAX_VALUE} , {Integer.MAX_VALUE, Integer.MAX_VALUE, 0, Integer.MAX_VALUE, 10} , {Integer.MAX_VALUE, Integer.MAX_VALUE, 20, 0, 60} , {Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, 0} }; int v = 0; int[] dist = new int[matrix.length]; int[] prev = new int[matrix.length]; labelCorrectingShortestPathAlgorithm(v, matrix, dist, prev); System.out.println(Arrays.toString(dist)); System.out.println(Arrays.toString(prev)); } public static void main(String[] args) { test(); } } |
|
来自: shaobin0604@1... > 《算法》