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;
}
相关文章推荐
- Dijkstra算法模板
- 1072. Gas Station PAT Dijkstra算法
- 单源最短路径Dijkstra算法(java实现)
- 算法储备之Dijkstra算法的各种优化(堆排序、priority_queue、set 优化)
- B - Frogger Dijkstra算法变形
- 第12周项目3-Dijkstra算法的验证
- Dijkstra算法--变型题的求解
- 第12周 【项目二】 Dijkstra算法的验证
- POJ 2387 Til the Cows Come Home (最短路径,Dijkstra算法)
- 最短路Dijkstra算法的一些扩展问题
- 路径规划Dijkstra算法
- Dijkstra算法1.0
- 图_dijkstra算法【数据结构实践报告】
- Dijkstra算法Python实现
- 单源点最短路径算法:Dijkstra算法
- 最短路——Dijkstra算法
- 数据机构学习笔记(四) 图之单源最短路径Dijkstra算法
- 数据结构——单源最短路径Dijkstra算法
- Dijkstra算法——java实现
- 为什么Dijkstra算法不能处理带负权边的图