Dijkstra算法

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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值