迪杰斯特拉(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;
    }
}

 

转载于:https://www.cnblogs.com/jianghaobo/p/6500612.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值