数据结构复习:迪杰斯特拉算法
注意迪杰斯特拉算法的前提是各点之间的权值为正的
迪杰斯特拉算法
算法步骤
1.初始化邻接矩阵
2.初始化起点到各个顶点的路径
3.初始化路径前驱数组
4.选取目前起点到所有点的最短的一个,确定为最短路径,并且在此之前到该顶点的最短路径还没有确定下来
5.将刚刚确定的点确定为最短路径
6,更新:以刚才确定的点为基础,看经过该点的下一个点的路径,是不是比原来的短,若是,则更新最短路径数组,和前驱路径数组
7.不断重复4-6步,直至找到到终点的最短路径;
代码:
#define MAXVEX 9
#define INFINITY 65535
// 用于存储最短路径下标的数组
typedef int Patharc[MAXVEX];
// 用于存储到各点最短路径的权值和
ShortPathTable[MAXVEX];
// Dijkstra算法,求有向网G的v0顶点到其余顶点v最短路径P[v]及带权长度D[v]
// P[v]的值为前驱顶点下标,D[v]表示v0到v的最短路径长度和
void ShortestPath_Dijkstra(MGraph G, int v0, Patharc *P, ShortPathTable *D){
int v,w,k,min;
// final[w]=1表示求得顶点v0至vw的最短路径
int final[MAXVEX];
// 初始化数据
for(v=0;v<G.numVertexes;v++){
// 全部顶点初始化为未知最短路径状态
final[v]=0;
// 将与v0点有连线的顶点加上权值
(*D)[v]=G.arc[v0][v];
// 初始化路径数组P为0
(*P)[v]=0;
}
// v0至v0不需要求路径
final[v0]=1;
// 开始主循环,每次求得v0到某个v顶点的最短路径
for(v=1;v<G.numVertexes;v++){
// 当前所知离v0顶点的最近距离
min=INFINITY;
// 寻找离v0最近的顶点
for(w=0;w<G.numVertexes;w++){
if(!final[w]&&(*D)[w]<min){
k=w;
min=(*D)[w]
}
}
// 将目前找到的最近的顶点置为1
final[k]=1;
// 修正当前最短路径及距离
for(w=0;w<G.numVertexes;w++){
// 如果经过v顶点的路径比现在这条路径的长度短的话
if(!final[w] && (min+G.arc[k][w]<(*D)[w])){
// 说明找到了更短的路径,修改D[w]和P[w]
// 修改当前路径长度
(*D)[w]=min+G.arc[k][w];
(*P)[w]=k;
}
}
}
}