package jef.tools.algorithm; public class Dijkstra { public static void main(String[] args) { new Dijkstra().use(); } public void use() { new Dijkstra().dijkstra(0, a, dist, prev); for (int i = 0; i < dist.length; i++) { System.out.print(dist[i] + " "); } } // 单元最短路径问题的Dijkstra算法 public void dijkstra(int v, float[][] a, float[] dist, int[] prev) { int n = dist.length - 1; if (v < 0 || v > n - 1) return; boolean[] s = new boolean[n + 1]; // 初始化 for (int i = 1; i <= n; i++) { dist[i] = a[v][i]; s[i] = false; if (dist[i] == Float.MAX_VALUE) { prev[i] = 0; } else { prev[i] = v; } } dist[v] = 0; s[v] = true; for (int i = 1; i < n; i++) { float temp = Float.MAX_VALUE; int u = v; for (int j = 1; j <= n; j++) { if ((!s[j]) && (dist[j] < temp)) { u = j; temp = dist[j]; } } s[u] = true; // 找到了第一个并入S的节点 for (int j = 1; j <= n; j++) { if ((!s[j]) && (a[u][j] < Float.MAX_VALUE)) { float newdist = dist[u] + a[u][j]; if (newdist < dist[j]) { // dist[j] 减少 dist[j] = newdist; prev[j] = u; } } } } } private float[][] a = { { 0, 10, max, 30, 100 }, { max, 0, 50, max, max }, { max, max, 0, max, 10 }, { max, max, 20, 0, 60 }, { max, max, max, max, 0 } }; private float[] dist = new float[5]; private int[] prev = new int[5]; public static final float max = Float.MAX_VALUE; }