Dijkstra算法

来源:互联网 发布:宜兴淘宝照片拍摄 编辑:程序博客网 时间:2024/05/29 10:03

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;
0 0
原创粉丝点击