您的位置:首页 > 其它

Dijkstra单源最短路径

2013-01-05 12:27 381 查看
比较简单的贪心算法

过程注释已经解释的过了

注意几个地方 ,我实现的这个权重都是整形的,这个是无所谓的,改成float或是double都可以

以邻接矩阵实现图

数组的含义需要搞清楚

int[] lowest = new int
;// 代表到达i点的最短距离
boolean[] use = new boolean
;// 代表i点有没有用过
int[] pre = new int
;// 代表到达i点最近的是哪个点
第一行第一列出于看着顺眼,没有用,也是无所谓的事

public class Dijkstra单源最短路径 {

public static void main(String[] args) {

// 第一行第一列不用
int[][] map = new int[6][6];

int n = map.length;

int v = 1;

// 如果到达不了,就是Integer的最大值
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {

// 表示很大的值,到不了
map[i][j] = Integer.MAX_VALUE;

}
}

// 初始化图
map[1][2] = 10;
map[2][3] = 50;
map[4][3] = 20;
map[1][4] = 30;
map[3][5] = 10;
map[4][5] = 60;
map[1][5] = 100;

int[] lowest = new int
;// 代表到达i点的最短距离
boolean[] use = new boolean
;// 代表i点有没有用过
int[] pre = new int
;// 代表到达i点最近的是哪个点

// 先从源点开始遍历,顺便初始化
for (int i = 1; i < n; i++) {

use[i] = false;
lowest[i] = map[v][i];

if (lowest[i] == Integer.MAX_VALUE) {
pre[i] = 0;
} else {
pre[i] = v;
}

}

// 表示v点已经被访问了
lowest[v] = 0;
use[v] = true;

for (int j = 1; j < n; j++) {

// 55行→70行:访问lowest[]中最小的并且没有被访问过的点
int min_p = v;
int min = Integer.MAX_VALUE;

for (int i = 1; i < n; i++) {

if (lowest[i] < min && !use[i]) {

min = lowest[i];
min_p = i;

}

}

use[min_p] = true;

// 72行→87行:从最新找出的点出发,寻找更近的lowest
for (int i = 1; i < n; i++) {

if (!use[i] && map[min_p][i] < Integer.MAX_VALUE) {

if (lowest[min_p] + map[min_p][i] < lowest[i]) {

lowest[i] = lowest[min_p] + map[min_p][i];

pre[i] = min_p;
}
}

}

}

// 输出到点5最近的距离
System.out.println(lowest[5]);

// 输出具体的路径
int find = 5;

System.out.println(find);

while (pre[find] != 0) {
find = pre[find];
System.out.println(find);
}

}

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