首页 > 代码库 > 迪杰斯特拉(Dijkstra)算法求最短路径
迪杰斯特拉(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)算法求最短路径
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。