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中,