Dijkstra

  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 }

 

posted @ 2014-11-28 19:27  glf2046  阅读(134)  评论(0编辑  收藏  举报