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 }