Dijkstra算法使用了贪心策略,解决了从某个源点到其余各顶点的最短路径问题,其时间复杂度为O(n^2).
typedef int Pathmatrix[MAXVEX]; //用于存储最短路径下标的数组
typedef int ShortPathTable[MAXVEX]; //用于存储各点最短路径的权值和
//Dijkstra算法,求有向网G的V0顶点到其余顶点V的最短路径P[V]及带权长度D[V]
//P[V]的值为前驱顶点下标,D[V]表示V0到V的最短路径长度和
void ShortestPtah_Dijkstra(MGraph G, int v0, Pathmatrix *P, ShortPathTable *D)
{
int v, w, k, min;
int final[MAXVEX]; //final[w]=1表示已求得顶点v0到vw的最短路径
//初始化数据
for (v = 0; v < G.numVertexs; ++v) {
final[v] = 0; //全部结点初始化为未求得最短路径状态
(*D)[v] = G.arc[v0][v]; //将于v0有连线的顶点加上权值
(*P)[v] = 0; //初始化路径数组P为0
}
final[v0] = 1;
//开始主循环,每次求得v0到某个顶点v的最短路径
for (v = 1; v < G.numVertexs; ++v) {
min = INF;
for (w = 0; w < G.numVertexs; ++w) { //寻找离v0最近的顶点
if (!final[w] && (*D)[w] < min) {
k = w;
min = (*D)[w];
}
}
final[k] = 1; //将目前找到的最近的顶点置为已找到最短距离的状态
for (w = 0; w < G.numVertexs; ++w) { //修正当前最短路径及距离
//如果经过v顶点的路径比现在这条路径的长度短的话
if (!final[w] && (min + G.arc[k][w] < (*D)[w])) {
(*D)[w] = min + G.arc[k][w]; //修改当前路径长度
(*P)[w] = k; //表示v0到vw的最短路径中,vw顶点的前驱是vk
}
}
}
}
采用栈操作来输出最短路径点
Pathmatrix P;
ShortPathTable D;
int start = 0, end = 3;
ShortestPtah_Dijkstra(G, start, &P, &D);
cout <<"最小权值:"<< D[end] << endl;
SqStack S; //建立空栈
S.top = -1;
int p = end;
while (p != start) {
Push(&S, p); //从终点开始将最短路径上的点入栈
p = P[p];
}
Push(&S, p);
cout << "最短路径:";
while (S.top != -1) {
cout<<S.data[S.top]<<' ';
--S.top;
}
cout << endl;