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);
}
}
}
过程注释已经解释的过了
注意几个地方 ,我实现的这个权重都是整形的,这个是无所谓的,改成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);
}
}
}
相关文章推荐
- Dijkstra求解单源点最短路径
- Dijkstra算法求单源最短路径
- 单源最短路径-迪杰斯特拉算法(Dijkstra's algorithm)
- POJ 1125 Stockbroker Grapevine (Dijkstra求所有点的单源最短路径)
- [模板] Dijkstra单源最短路径
- PAT 1030 Travel Plan(单源最短路径+优化Dijkstra)
- 单源最短路径 :Dijkstra 算法
- 单源最短路径问题[Dijkstra实现]
- Dijkstra不能得到含有负权边图的单源最短路径
- 数据结构 学习笔记(八):图(中):最短路径问题(单源最短路径 Dijkstra,多源最短路径 Floyd)
- 数据结构重读——单源最短路径(Dijkstra) 转自酷勤
- sicily1031-Campus(单源最短路径dijkstra)
- P3371 【模板】单源最短路径 SPFA优化 dijkstra堆优化
- 单源最短路径---BellmanFord,Dijkstra
- poj1062-子图dijkstra单源最短路径问题
- 图论_单源最短路径_Dijkstra
- NYOJ有趣的问题(单源最短路径dijkstra)
- Dijkstra求单源最短路径(图,数据结构)
- 贪心算法之单源最短路径Dijkstra
- Dijkstra单源最短路径