1 package fred.ubs.test.src.algo; 2 3 public class DijkstraTest { 4 public static void main(String[] args) { 5 int n = 8; 6 Node[] nodes = new Node[n]; 7 setupNodes(nodes); 8 float[] d = new float[n]; 9 int[] p = new int[n]; 10 11 dijkstra(nodes, n, 0, d, p); 12 13 for(int i = 0; i < n; i++){ 14 System.out.print(d[i] + " "); 15 } 16 17 for(int i = 0; i < n; i++){ 18 System.out.print(p[i] + " "); 19 } 20 } 21 22 public static void dijkstra(Node[] nodes, int n, int u, float[] d, int[] p){ 23 float temp; 24 int i, j, t; 25 boolean[] s = new boolean[n]; 26 Node pNode; 27 28 for(i = 0; i <n; i++){ 29 d[i] = Float.MAX_VALUE; 30 s[i] =false; 31 p[i] = -1; 32 } 33 34 if(null == (pNode = nodes[u].next)){ 35 return; 36 } 37 38 while(pNode != null){ 39 d[pNode.v_num] = pNode.len; 40 p[pNode.v_num] = u; 41 pNode = pNode.next; 42 } 43 44 d[u] = 0; 45 s[u] = true; 46 47 for(i = 1; i < n; i++){ 48 temp = Float.MAX_VALUE; 49 t = u; 50 for(j = 0; j <n; j++){ 51 if(!s[j] && d[j] < temp){ 52 t = j; 53 temp = d[j]; 54 } 55 } 56 if(t == u){ 57 break; 58 } 59 s[t] = true; 60 pNode = nodes[t].next; 61 while(pNode != null){ 62 if(!s[pNode.v_num] && d[pNode.v_num] > d[t] + pNode.len){ 63 d[pNode.v_num] = d[t] + pNode.len; 64 p[pNode.v_num] = t; 65 } 66 67 pNode = pNode.next; 68 } 69 } 70 } 71 72 private static void setupNodes(Node[] nodes){ 73 Node nodeA = new Node(0, 0, new Node(1, 1, new Node(4, 2, new Node(4, 3, null)))); 74 Node nodeB = new Node(0, 1, new Node(2, 2, new Node(9, 4, null))); 75 Node nodeC = new Node(0, 2, new Node(3, 3, new Node(6, 4, new Node(3, 5, new Node(4, 6, null))))); 76 Node nodeD = new Node(0, 3, new Node(7, 6, null)); 77 Node nodeE = new Node(0, 4, new Node(1, 7, null)); 78 Node nodeF = new Node(0, 5, new Node(2, 4, new Node(5, 7, null))); 79 Node nodeG = new Node(0, 6, new Node(1, 5, new Node(3, 7, null))); 80 Node nodeH = new Node(0, 7, null); 81 82 nodes[0] = nodeA; 83 nodes[1] = nodeB; 84 nodes[2] = nodeC; 85 nodes[3] = nodeD; 86 nodes[4] = nodeE; 87 nodes[5] = nodeF; 88 nodes[6] = nodeG; 89 nodes[7] = nodeH; 90 } 91 92 static class Node{ 93 94 public Node(float len, int v_num, Node next) { 95 this.v_num = v_num; 96 this.len = len; 97 this.next = next; 98 } 99 100 public int v_num; 101 public float len; 102 public Node next; 103 } 104 }