#define MAXVEX 9
#define INFINITY 65535
typedef int PathMatrix[MAXVEX] //用于存储最短路径下标的数组
typedef int ShortPathTable[MAXVEX] //用于存储到各点最短路径的权值和 比如V0到V2的权值是4
void ShortestPath_DIJ(MGraph G, int V0, PathMatrix &P, ShortPathTable &D) //接口:输入的是无向图G,初始点VO,路径矩阵P,以及路径表格,
{
int final[MAXVEX]; //final[v] = 1 表示已经求得顶点V0到Vw的最短路径。为1的话表明已经取得,为0的话表明还没有取得。
//初始化数据 初始化数据用的是v0到其他各个结点的长度。
for(v=0; v<G.numVertexes; v++)
{
final[v] = 0; //全部顶点初始化为未找到的最短路径,所以初始化都为0
(*D)[v] = G.arc[v0][v]; //将与v0点有联系的顶点加上权值(距离)。 在邻接矩阵中,从V0到V8的最大顶点数开始遍历。
(*p)[V] = 0; //初始化路径数组P为0;
}
(*D)[V0] = 0; //v0到v0的路径为0
final[V0] = 1; //V0到V0不需要求路径。
//开始主循环,每次求得V0到某个V顶点的最短路径 这个循环分为两部分,根prim算法一样,先求出第一部分,然后进行纠正更新。
for(v=1; v< G.numVertexes; v++) //从1开始的,从第一个顶点开始探讨 接着从下个结点开始。
{
min = INFINITY;
//从D数组中找到最小的值。
for(w=0; w<G.numVertexes; w++)
{
if(!final[w] && (*D)[w]<min)
{
k = w; //k存储的是距离当前结点距离最近的结点
min = (*D)[w];
}
}
final[k] = 1;
//修正当前最短路径以及距离 要求下一层的结点要小于上一个结点到其他结点的距离。
for (w=0; w<G.numVertexes; w++)
{
if(!final[w] && min+G.arc[k][w] < [*D][w]) //当前的min+其他的。
{
(*D)[w] = min + G.arc[k][w] //修正当前路径长度; 利用前驱顶点和其他顶点的长度且和前面的长度累积比大小。
(*p)[w] = k; //存放前驱顶点。 前驱结点和这个结点相连接的权值之和为<(*D)[k]. 发现用到p没什么用!
}
}
}
}
详情过程可以参考这个!
https://wenku.baidu.com/view/6dc5c62486c24028915f804d2b160b4e767f810f