您的位置:首页 > 其它

Dijkstra算法

2009-07-24 21:38 260 查看

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: