//该算法简单说就是在图里求给定顶点到各个顶点的最短路径和最小权值。
//过程方法是,遍历并记录起始点到各个顶点的距离,取最小权值邻接点,记录前驱结点。最终生成的结果
//可通过前驱结点找到起点到该顶点的最短路径。
Void Dijkstra(MGraph G,int v,int path[],int dist[]){//参数分别为:图,源点(起点),供保存
//该点到源点最小路径的前驱结点的路径数组,供保存原点到该顶点最短路径的权值
int s[maxSize];//未找到最短路径的顶点置为0,找到则改为1
int i,j,min,u;
for(i=0;i<G.vexnum;i++){//初始处理,记录原点到各个顶点的距离,无路径则为65535
dist[i]=G.edge[v][i];
s[i]=0;
if(G.edge[v][i]<65535) path[i]=v;//若该顶点原点能到达,则将前驱顶点先置为原点
else path[i]=-1;//否则暂无前驱结点
}
s[v]=1;//原点到原点没有最短路径
path[v]=-1;//没有前驱
for(i=0;i<G.vexnum;i++){//循环查找部分,每次都选择原点能到达其他剩余顶点中权值最小的那
//一个,即找到了原点到该顶点的最小权值,记录前驱结点可逆向找到最短路径
min=65535;
for(j=0;j<G.vexnum;j++){//找原点能到达剩余顶点中权值最小的顶点
if(s[j]==0&&dist[j]<min){
u=j;
min=dist[j];
}
}
s[u]=1;//已找到
for(j=0;j<G.vexnum;j++){//根据已确定的顶点,可根据该顶点拓展出到其他剩余顶点的路径
//,所以需要重新比较更新原点到剩余顶点的最小权值
if(s[j]==0&&dist[u]+G.Edges[u][j]<dist[j]){
dist[j]=dist[u]+Edges[u][i];//新加入的顶点带来的路径若更小,则修改最小权值
path[j]=u;//这条较短的路径是由顶点u过来的
}
}
}
}
该算法时间复杂度为O(n^2)。值得注意的是,路径权值不得为负数,不然会导致算法出错。