我用的是邻接矩阵来存储图的。
代码如下:
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; } }
时间: 2024-10-14 07:10:04