Dijkstra算法
本文编写参照此文章: Dijkstra算法图文详解.
算法概念
Dijkstra算法的目标是计算出有向图中,某一点到其他点之间的最短距离,使用的是贪心算法的思想
算法过程
数据元素(本文使用的数组元素都从下标1开始使用,不使用下标0):
map:二维数组,有向图
distance:一维数组,distance[i]为从起点到结点i的最小距离
visited:一维数组,visited[i]为结点i是否访问过
每一次都从distance中选择最近的那一个可访问且未访问过的结点,令index为该结点下标,根据有向图map,从这个结点查找他能访问到的所有结点,查看distance[index] + map[index][j]
与distance[j]的关系,如果更小则代表寻找到一条更短的路径,令distance[j] = istance[index] + map[index][j]
直接看实例:
有向图map如下
初始的distance数组,每一个元素都是Integer.MAXVALUE
初始的vistited数组,每一个元素都是false
假设要寻找结点1 到其他结点之间的最短距离
在正式开始之前,设置起点的distance为0,即distance[1] = 0
首先从结点1开始,minDistance = distance[1] = 0,可访问的结点为结点2和结点
1到2的距离为0+1,小于distane[2],distane[2]=1
1到3的距离为0+12,小于distance[3],distane[3]=12
此时distance数组内容为:
0, 1, 2, 3, 4, 5, 6
[2^31-1, 0, 1, 12, 2^31-1, 2^31-1, 2^31-1]
此时结点1被标记为已访问,不能再使用结点1,排除结点1后,distance最小的结点为结点2,所以这次使用结点2
minDistance = distance[2] = 1,可访问的结点为结点3和结点4
2到3的距离为9,1 + 9小于distane[3],distane[2]=10
2到4的距离为3,1 + 3小于distance[4],distane[4]=4
此时distance数组内容为:
0, 1, 2, 3, 4, 5, 6
[2^31-1, 0, 1, 10, 4, 2^31-1, 2