- Status ShortestPath_DIJ(MGraph G,VertexType vv,int P[][100],int D[]){
- //用Dijkstra算法求G的v0到其余顶点v的最短路径及其带权长度D[v]
- //若P[v][w]为TRUE,则w是从v0到w的当前最短路径的顶点
- //当final[v]为TRUE时 表明已求得最短路径
- int v0=LocateVex(G,vv);
- int final[10];
- for(int v=0;v<G.vexnum;++v){
- final[v]=FALSE; //当其为TRUE时 表明已求得最短路径
- D[v]=G.arcs[v0][v].adj;
- for(int w=0;w<G.vexnum;++w) P[v][w]=FALSE;//设空路径
- if(D[v]<INFINITY){
- P[v][v0]= TRUE;
- P[v][v]=TRUE;
- }
- }//for
- D[v0]=0;final[v0]=1; //初始化,v0顶点属于S集
- printf("%c到 v顶点的最短距离及途经顶点/n",vv);
- int min=0; //开始主循环,每次求得v0到某个v顶点的最短路径,并加v到S集
- for(int i=1;i<G.vexnum;++i){ ///其余G.vexnum-1各顶点//循环n-1次结束
- min=INFINITY; //当前离所知的顶点v0的最近距离
- for(int w1=0;w1<G.vexnum;++w1)
- if(!final[w1]) //w顶点在V-S中
- if(D[w1]<min){
- v=w1;
- min=D[w1]; //w1离顶点v0最近
- }
- final[v]=TRUE; //离v0点最近的v加入S集
- printf("/n %c%8d",G.vexs[v],min);//输出函数部分
- printf(" ");
- for(int j=0;j<G.vexnum;++j)
- if(P[v][j])printf("%c",G.vexs[j]);//输出最短路径上的所有顶点
- for(int w2=0;w2<G.vexnum;++w2) //更新当前最段路径机距离
- if(!final[w2]&&(min+G.arcs[v][w2].adj<D[w2])){//修改D[w2]和P[w2]
- D[w2]=min+G.arcs[v][w2].adj;
- for(int s=0;s<G.vexnum;++s)
- P[w2][s]=P[v][s];
- P[w2][w2]=TRUE; //P[w2]=P[v]+P[w2]
- }//if
- }//for
- printf("/n");
- return OK;
- }
用Dijkstra算法求图最短路径
最新推荐文章于 2022-11-14 19:08:23 发布