Dijkstra算法是图论中的一个重要的基础算法,是解决有权图单源最短路径问题的核心算法,大家需要牢固掌握;
我们先来回顾下Dijkstra算法:WeightType dist[] 是记录最短路径值的数组,Vertex path[] 是记录最短路径下每个顶点的前驱顶点 的数组
结构体设计说明
typedef int Vertex; //顶点
typedef int WeightType; //边权
typedef int DataType; //顶点数据(点权)
//边
typedef struct _Edge{
Vertex V1,V2;
WeightType Weight;
}Edge;
//邻接矩阵存储的图
typedef struct _MGraph{
int Nv; //顶点数
int Ne; //边数
WeightType G[MaxVertexNum][MaxVertexNum]; // 邻接矩阵
DataType Data[MaxVertexNum]; //存顶点的数据 很多情况下,顶点无数据,此时不用出现
}MGraph;
Dijkstra
/* 邻接矩阵存储 —— 有权图的单源最短路算法 */
bool Dijkstra( MGraph* Graph,int dist[],int path[],Vertex S )
{
int collected[MaxVertexNum];
Vertex V,W;
/* 初始化:此处默认邻接矩阵中不存在的边用INFINITY表示 */
for(V=0;V<Graph->Nv;V++){
dist[V] = Graph->G[S][V];
if(dist[V]<INFINITY){
path[V] = S;
}else{
path[V] = -1;
}
collected[V] = false;
}
/* 先将起点S收入集合 */
dist[S] = 0;
collected[S] = true;
while(1){
/* V=未被收录顶点中dist最小者 */
V = FindMinDist( Graph,dist,collected );
if(V==ERROR) break;//若这样的V不存在,即所有的顶点都收录完成
collected[V] = true; // 收录V
for(W=0;W<Graph->Nv;W++){ //对图中的每个顶点W
/* 若W是V的邻接点并且未被收录 */
if(collected[W])==false &&Graph->G[V][W]<INFINITY){
if(Graph->G[V][W] < 0){ //若有负边
return false; //Disjkstra算法无法解决,返回错误标记
}
/* 若收录V使得dist[W]变小 */
if(dist[V]+Graph->G[V][W] < dist[W]){
dist[W] = dist[V] + Graph->G[V][W]; //修正dist[W]
path[W] = V; //修正S到W的路径
}
}
}
} /* while结束 */
return true; /* 算法执行完毕,返回正确标记 */
}
Vertex FindMinDi