迪杰斯特拉(Dijkstra)算法求最短路径

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迪杰斯特拉(Dijkstra)算法求最短路径相关的知识,希望对你有一定的参考价值。

我用的是邻接矩阵来存储图的。

代码如下:

void Graph:: Dijkstra(){
    struct DijNode{
        int index;
        int distance;
        vector<string> path;
        bool Founded;   //判定是否找到了...
    };
    DijNode*shorestPaths=new DijNode[mgraph.vexnum];
    string startPoint;
    int startIndex;
    cout<<"请输入单源点:"<<endl;
    cin>>startPoint;
    locate(startPoint,startIndex);
    //初始化数组
    shorestPaths[0]={startIndex,0,vector<string>{startPoint},true};
    for(int i=1;i<mgraph.vexnum;i++){
        shorestPaths[i]=DijNode{i,NONE,vector<string>{""},false};
    }
    //开始运行
    for(int i=1;i<mgraph.vexnum;i++){
        cout<<startIndex<<endl;
        //若这个点尚未确定最短路径并且从当前点出发存在路径且短于当前,那么很好,可以考虑
        for(int i=0;i<mgraph.vexnum;i++){
            if(i!=startIndex&&mgraph.arcs[startIndex][i].adj+shorestPaths[startIndex].distance<shorestPaths[i].distance&&shorestPaths[i].Founded==false){
                shorestPaths[i].path=shorestPaths[startIndex].path;
                shorestPaths[i].path.push_back(mgraph.vexs[i]);
                shorestPaths[i].distance=shorestPaths[startIndex].distance+mgraph.arcs[startIndex][i].adj;
            }
        }
        //挑选当前出距离最短的且未找到最短的路径的定点作为startPoint
        int MIN=-1;
        for(int i=0;i<mgraph.vexnum;i++){        //选出符合要求的第一个MIN值
            if(shorestPaths[i].Founded==false){
                MIN=i;
                break;
            }
        }
        for(int i=0;i<mgraph.vexnum;i++){
            if(shorestPaths[i].Founded==false&&shorestPaths[i].distance<shorestPaths[MIN].distance){
                MIN=i;
            }
        }
        shorestPaths[MIN].Founded=true;
        startIndex=MIN;
    }
    //结果输出
    for(int i=1;i<mgraph.vexnum;i++){
        cout<<"从单源点"<<mgraph.vexs[shorestPaths[0].index]<<""<<mgraph.vexs[shorestPaths[i].index]<<"的最短路径为:";
        for(int j=0;j<shorestPaths[i].path.size()-1;j++){
            cout<<shorestPaths[i].path[j]<<"->";
        }
        cout<<shorestPaths[i].path[shorestPaths[i].path.size()-1]<<"路径长度:"<<shorestPaths[i].distance<<endl;
    }
}

 技术分享

以上是关于迪杰斯特拉(Dijkstra)算法求最短路径的主要内容,如果未能解决你的问题,请参考以下文章

(王道408考研数据结构)第六章图-第四节4:最短路径之迪杰斯特拉算法(思想代码演示答题规范)

迪杰斯克拉算法是怎样的?

算法-迪杰斯特拉算法(dijkstra)-最短路径

迪杰斯特拉算法为啥不能有负权边

用Dijkstra算法求最短路径的MATLAB程序

最短路径 - 迪杰斯特拉(Dijkstra)算法