void ShortestPath_DIJ(MGraph G,int v0,PathMatrix &P,ShortPathTable &D)
{ //用Dijkstra算法求有向网G的v0顶点到其余顶点v的最短路径P[v]及其带权长度D[v]。 //若P[v][w]为TRUE,则w是从v0到v当前求得最短路径上的顶点。
//final[v]为TRUE当且仅当v∈S,即已经求得从v0到v的最短路径。
int final[vexnum];
for(v=0; v<G.vexnum; ++v)
{ final[v]=0;
D[v]=G.arcs[v0][v];
for(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] = TRUE;
//初始化,v0顶点属于S集
//开始主循环,每次求得v0到某个v顶点的最短路径,并加v到s集。
for(i=1; i<G.vexnum;++i)
{ //其余G.vexnum-1个顶点
min = INFINITY;
//当前所知离v0顶点的最近距离
for(w=0;w<G.vexnum;++w)
if(!final[w]) //w顶点在V-S中
if(D[w]<min){v=w;min=D[w];} //w顶点离v0顶点更近
final[v]=TRUE; //离v0顶点最近的v加入S集
for(w=0;w<G.vexnum;++w) //更新当前最短路径及距离
if(!final[w]&&(min+G.arcs[v][w]<D[w]))
{
//修改D[w]和P[w]
D[w]=min+G.arcs[v][w];
P[w]=P[v];
P[w][w]=TRUE;
//P[w]=P[v]+[w]
}//if
}//for
}//ShortestPath_DIJ
图@ 最短路径
最新推荐文章于 2024-09-14 22:25:23 发布