迪杰斯特拉是求单源最短路径的问题,有向带权图G=(V,E),每条边的权是非负实数
算法思路:
假定源点为u,顶点集合V被划分为两个部分:集合S和集合V-S,初始时S中仅含有u(假定图中绿色为V,求1到5的最短路径)
接下来,从V-S结合中找出dist最小的点,将其放入V中,并且以该点为媒介,更新dist和pre
继续找
继续找,这一次没有更新
最后一次,算法结束
至此可得1-5的最短路径为5,而路径为1-2-3-5
public class Main {
static final int N = Integer.MAX_VALUE;
public static void main(String[] args) {
int[][] map = new int[][]{
{N, 2, 5, N, N},
{N, N, 2, 6, N},
{N, N, N, 7, 1},
{N, N, 2, N, 5},
{N, N, N, N, N},
};
dijkstra(map,2,4);
}
public static void dijkstra(int[][] map, int start, int end) {
int n = map.length;
int[] dist = new int[n];
int[] p = new int[n];
boolean[] flag = new boolean[n];
for (int i = 0; i < n; i++) {
dist[i] = map[start][i];
p[i] = start;
}
p[start] = start;
dist[start] = 0;
flag[start] = true;
for (int i = 0; i < n; i++) {
int temp = N, t = start;
//找到P-V中距离最短的
for (int j = 0; j < n; j++)
if (!flag[j] && dist[j] < temp) {
t = j;
temp = dist[j];
}
if (t == start)
break;
flag[t] = true;
for (int k = 0; k < n; k++) {
if (!flag[k] && map[t][k] < N)
if (dist[k] > dist[t] + map[t][k]) {
dist[k] = dist[t] + map[t][k];
p[k] = t;
}
}
}
System.out.println(start+"到"+end+"的最短路径为"+dist[end]);
String path ="end";
int index = end;
while (p[index] != index) {
path = index+"-->"+path;
index = p[index];
}
path = start+"-->"+path;
System.out.println(path);
}
}