概述
感觉迪杰斯特拉好难,才学会的这个算法,所以写下博客加深理解。
Dijkstra算法是从一个顶点到其余各顶点的最短路径算法,解决的是带权图中最短路径问题。
Dijkstra算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
Dijkstra算法将图中的节点集分为:
1.最短路径计算完成的节点集S
2.最短路径未计算完成的节点集T
首先选择一个起点,然后每次将从T中挑选“起点->某节点”的路径最短的节点加入S,并更新”起点“经由”某节点”到T中剩余节点的更短距离,直到T中的节点全部加入S中,它在每次都选择一个距离起点最近的节点加入最短路径节点集合。
算法流程
下面我们使用这个图走一遍算法流程,这里我们选择节点A作为起点,计算从起点A到剩余节点的最短路径。
我们使用shortest[ ]、visited[ ]这两个数组,
shortest[index]:存储A到该节点的最短路径,
visited[index]存储v0到该节点的最短路径是否求出。
S为已求出最短路径的节点集,T为未求出最短路径的节点集。起点只允许将S中的节点作为中间节点来计算到达其它节点的最短路径,不允许将T中的节点作为中间节点来计算到达其它节点的最短路径。随着S中节点的增加,起点可达的节点才会增加。
初始状态下,起点只可达B,C,G节点。
1.
将起点A加入S中,对shortest[ ]、visited[ ]进行更新。

2.
S中现有节点A,起点可达T中的B,C,G节点
节点A->节点B距离为5,节点A->节点C距离为7,节点A->节点G距离为2
按距离从小到大排序,因此选择将节点G加入S中。
更新“起点将节点G作为中间节点到达其它节点的距离”。

3.
S中现有节点A和节点G,起点可达T中的节点C,B,E,F
A->C=7,A->B=5,A->G->E=6,A->G->F=8
因此选择将节点B加入S中
更新“起点将节点B作为中间节点到达其它节点的距离”

4.
S中现有节点A,B,G,起点可达T中的节点C、D、E,F
A->C=7,A->G->E=6,A->G->F=8,A->B->D=14
因此选择将节点E加入S中
更新“起点将节点E作为中间节点到达其它节点的距离”

5.
S中现有节点A、B、E、G,起点可达T中的节点C、D、F,
A->C=7,A->G->F=8,A->B->D=14
因此选择将节点C加入S中
更新“起点将节点C作为中间节点到达其它节点的距离”

6.
S中现有节点A、B、C、E、G,起点可达T中的节点D、F
A->F=8,A->B->D=14
因此选择将节点F加入S中
更新“源点将节点F作为中间节点到达其它节点的距离。”

7.
S中现有节点A、B、C、E、F,G
起点可达T中的节点D
A->G->F->D=12
因此选择将节点D加入S中
更新“源点将节点D作为中间节点到达其它节点的距离。”

结束:到此起点到所有节点的最短路径都求出来了。
JAVA代码实现
package 尚硅谷_数据结构和算法.十种算法.迪杰斯特拉算法;
public class DijstraAlgorithm {
//不能设置为Integer.MAX_VALUE,否则两个Integer.MAX_VALUE相加会溢出导致出现负权
public static int M = 100000;
//定义七个顶点
private static char[] vertex = {
'A', 'B', 'C', 'D', 'E', 'F', 'G'};
public static void main(String[] args) {
//初始化邻接矩阵
int[][] matrix = new int[vertex.length][vertex.length]

17万+

被折叠的 条评论
为什么被折叠?



