由于每一次的比较都是在上一次集合的最优结果中计算的,所以新计算出来的顶点3到集合S={1, 2, 4}的最短距离也是全局最优的。
对应的C语言代码如下:
#include
#define M 65535 //无穷大
#define N 5 //顶点数
//Dijkstra算法函数,求给定顶点到其余各点的最短路径
//参数:邻接矩阵、出发点的下标、结果数组、路径前一点记录
void Dijkstra(int Cost[][N], int v0, int Distance[], int prev[])
{
int s[N];
int mindis,dis;
int i, j, u;
//初始化
for(i=0; i dis)
{
Distance[j] = dis;
prev[j] = u;
}
} // if 语句体结束,j循环结束
} // i循环结束
}
// 输出最短路径
// 参数:路径前一点记录、出发点的下标、到达点下标
void PrintPrev(int prev[],int v0,int vn)
{
int tmp = vn;
int i, j;
//临时存路径
int tmpprv[N];
//初始化数组
for(i=0; i < N; i++)
tmpprv[i] = 0;
//记录到达点下标
tmpprv[0] = vn+1;
//中间点用循环记录
for(i =0, j=1; j < N ;j++)
{
if(prev[tmp]!=-1 && tmp!=0)
{
tmpprv[i] = prev[tmp]+1;
tmp = prev[tmp];
i++;
}
else break;
}
//输出路径,数组逆向输出
for(i=N-1; i >= 0; i--)
{
if(tmpprv[i] != 0)
{ //排除0元素
printf("V%d", tmpprv[i]);
if(i) //不是最后一个输出符号
printf("-->");
}
}
printf("-->V%d", vn+1);
}
//主函数
int main()
{
//给出有向网的顶点数组
char *Vertex[N]={"V1", "V2", "V3", "V4", "V5"};
//给出有向网的邻接矩阵
int Cost[N][N]={
{0, 10, M, 30, 100},
{M, 0, 50, M, M},
{M, M, 0, M, 10},
{M, M, 20, 0, 60},
{M, M, M, M, 0},
};
int Distance[N]; //存放求得的最短路径长度
int prev[N]; //存放求得的最短路径
int i;
//调用Dijkstra算法函数,求顶点V1到其余各点的最短路径
//参数:邻接矩阵、顶点数、出发点的下标、 结果数组
Dijkstra(Cost, 0, Distance, prev);
for(i=0; i < N; i++)
{
//输出最短路径长度
printf("%s-->%s:%d\t", Vertex[0], Vertex[i], Distance[i]);
//输出最短路径
PrintPrev(prev, 0, i);
printf("\n");
}
return 0;
}
程序运行结果截图:
参考文章:http://zengwu3915.blog.163.com/blog/static/278348972009109101834282/