参考:https://blog.csdn.net/qq_35644234/article/details/60870719
问题描述:从图中的某个顶点出发到达其余任意一个顶点所经过的边的权重和最小的一条路径,称为单源最短路径。
以下图为例:
mat_adjc(邻接矩阵)
1、Dijkstra算法介绍
特点:使用了广度优先搜索解决带权有向图或者无向图的单源最短路径问题。
思路:采用的是贪心策略,声明一个数组dis来保存指定源点到各个顶点的最短距离、路径以及该顶点有没有被标记过(加入集合V)。指定源点begin,将v(begin)加入集合V,一维数组dis初始化为mat_adjc[begin-1],接下来从dis数组中选择最小且没有被标记过的顶点temp+1标记加入集合V,按照如下规则更新dis数组:
遍历dis数组,假设当前处于dis数组的第i个位置,若顶点temp+1到顶点i+1之间存在可达边,即mat_adjc[temp][i]!=INT_MAX,且v(begin)通过顶点temp+1到达i+1更近(比不通过顶点temp+1到达i+1),即dis[temp].value+mat_adjc[temp][i]<dis[i].value,更新dis[i],dis[i].value = dis[temp].value+mat_adjc[temp][i],dis[i].path = dis[temp].path+"-->v"+to_string(i+1)。
重复以上步骤,最多N次。(N为顶点数量)
实例过程如下: