Dijkstra(迪杰斯特拉)算法
采用广度优先搜索思想,对有向赋权图寻找最短路径。
该算法对于不含负权的有向图来说,是目前已知的最快的单源最短路径算法。
时间复杂度:O(n^2)
基本原理:不断为为每个顶点 v 保留目前为止所找到的从s到v的最短路径
上图为戴克斯特拉算法应用示意图。
起点以左下角的红点,目标是右上角的绿点,中间灰色的倒L型为障碍物。蓝色空圈表示”暂定”,用以搜索下一步;已经填充颜色的表示探访过,图中颜色以红到绿,越绿表示离起点越远。所有节点都被均匀的探索。
我们以下图为例:
假设以“1”为顶点出发,求解到每个顶点的最短路径,若可达,则输出最短路径;若不可达,则输出无穷大(32767)
shortest(1, 2)=2
shortest(1, 3)=4
shortest(1, 4)=5
注:经对比,第二种路径得到的权值和较小,取第二种方式
shortest(1, 5)=2
算法如下:
void dijkstra(AdjMatrix *G)
{
int i,j;
int min,minid;
int tmp;
int vs;
int prev[MAX] = {
0};
int dist[MAX] = {
0};
int visited[MAX]; // visited[i]=1表示"顶点vs"到"顶点i"的最短路径已成功获取。
// 初始化
printf("请输入要查询的单源顶点");
scanf(