1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
| public class test {
static int maxint = 65533;
public static void main(String[] args) { int n = 5; int[][] c = new int[n][n]; c[0] = new int[]{0, 10, maxint, 30, 100}; c[1] = new int[]{maxint, 0, 50, maxint, maxint}; c[2] = new int[]{maxint, maxint, 0, maxint, 10}; c[3] = new int[]{maxint, maxint, 20, 0, 60}; c[4] = new int[]{maxint, maxint, maxint, maxint, 0}; int[] dist = new int[n]; int[] prev = new int[n]; int v = 0; Dijkstra(n, v, dist, prev, c); path(2, prev); }
public static void path(int x, int[] prev) { if (prev[x] == 0) { System.out.println((x + 1) + " <--- " + (prev[x] + 1)); } else { System.out.println((x + 1) + " <--- " + (prev[x] + 1)); path(prev[x], prev); } }
public static void Dijkstra(int n, int v, int[] dist, int[] prev, int[][] c) { boolean[] s = new boolean[n]; for (int i = 0; i < n; i++) { dist[i] = c[v][i]; s[i] = false; if (dist[i] == maxint) { prev[i] = 0; } else { prev[i] = v; } } dist[v] = 0; s[v] = true; System.out.println(" 1 2 3 4 5"); for (int j = 0; j < s.length; j++) { if (j == 0) { System.out.print("初始化: s: "); } System.out.printf("%-8b", s[j]); if (j == s.length - 1) { System.out.println(); } }
for (int i = 0; i < dist.length; i++) { if (i == 0) { System.out.print(" dist: "); } if (dist[i] == maxint) { System.out.print("inf "); } else { System.out.printf("%-8d", dist[i]); } if (i == dist.length - 1) { System.out.println(); } } for (int i = 1; i < n; i++) { int temp = maxint; int u = v; for (int j = 0; j < n; j++) { if ((!s[j]) && (dist[j] < temp)) { u = j; temp = dist[j]; } } s[u] = true; for (int j = 0; j < s.length; j++) { if (j == 0) { System.out.print(i + ": s: "); } System.out.printf("%-8b", s[j]); if (j == s.length - 1) { System.out.println(); } } for (int j = 0; j < n; j++) { if ((!s[j]) && (c[u][j] < maxint)) { int newdist = dist[u] + c[u][j]; if (newdist < dist[j]) { dist[j] = newdist; prev[j] = u; } } } for (int k = 0; k < dist.length; k++) { if (k == 0) { System.out.print(" dist: "); } if (dist[k] == maxint) { System.out.print("inf "); } else { System.out.printf("%-8d", dist[k]); } if (k == dist.length - 1) { System.out.println(); } } } } }
|