Dijkstra算法

来源:互联网 发布:世界史 书籍 知乎 编辑:程序博客网 时间:2024/06/02 12:31

Dijkstra算法

  Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。
  Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。
  Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表方式,Drew为了和下面要介绍的 A* 算法和 D* 算法表述一致,这里均采用OPEN,CLOSE表的方式。
  其采用的是贪心法的算法策略
  大概过程:
  创建两个表,OPEN, CLOSE。
  OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。
  1. 访问路网中距离起始点最近且没有被检查过的点,把这个点放入OPEN组中等待检查。
  2. 从OPEN表中找出距起始点最近的点,找出这个点的所有子节点,把这个点放到CLOSE表中。
  3. 遍历考察这个点的子节点。求出这些子节点距起始点的距离值,放子节点到OPEN表中。
  4. 重复第2和第3步,直到OPEN表为空,或找到目标点。
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;
}
原创粉丝点击