Dijkstra算法是计算有权值图的单源最短路径问题的经典算法
算法核心思想:定义一个顶点集合S{V0,V1,……Vn},初始条件下集合S中只包含起始源点。
对于所有顶点V,定义dist[V]来表示V到源点的最短距离。
每次循环在所有未被收录进集合S的顶点中,挑选出dist值最小的顶点Vmin,将其收录进集合S。
当一个顶点V被收录进集合S中时,检测V的所有邻接点的dist值是否产生变化。
注意:Dijkstra算法不能处理负权边。
变量定义和初始化:
double dist[Graph->nV];
int path[Graph->nV];
int dijkstra[Graph->nV];
dist数组用于记录任一顶点到源点的最短距离,path数组用来记录通过最短距离找到该顶点的路径(path[V]即V的前一个必经顶点),dijkstra数组用来标记顶点是否被收录进集合S;
for(int i=0;i<Graph->nV;i++){
dist[i]=__DBL_MAX__,path[i]=-1,dijkstra[i]=0;
}
dijkstra[start]=1;
dist[start]=0;
将所有顶点的dist值初始为正无穷,所有顶点的路径(指示前一顶点)初始为-1,集合S初始为空。
对于源点V,首先将其收录到集合S中,

本文介绍了Dijkstra算法在计算有权值图的单源最短路径问题中的应用,详细讲解了算法的核心思想和实现步骤。通过C语言实现邻接表,讨论了处理负权边的问题,并探讨了算法的时间复杂度,包括直接扫描和使用最小堆两种情况。
最低0.47元/天 解锁文章
164

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



