数据结构这块内容关于图的内容不少,本文写单源最短路径的兄弟“单目标最短路径”,其思路和方法和单源最短路径相同。
- 单源最短路径问题提法:给定一个有向带权图G与源点v,各边上的权值均非负。要求找出从v到G中其他各顶点的最短路径。
- 单目标最短路径问题提法:一个带权有向图G中求各个顶点到某一指定顶点v的最短路径。
对Dijkstra做适当的修改。dist[i]:从顶点i到目标顶点v的最短路径长度。path[i]:从顶点i到目标顶点v的最短路径上该顶点的后继顶点。
对下图所示带权有向图,用算法(即后面代码)得出各个顶点到顶点2的最短路径。
主要算法如下:4-2:dist[4]=2
3-2:dist[3]=3
1-3-2:dist[1]=4
0-1-3-2:dist[0]=10
void sdsp(Graph G,int v,Weight dist[],int path[]){
int i,j,u;Weight w;bool s[G.numVertices];
for(i=0;i<G.numVertices;i++)
s[i]=false;
s[v]=true;
for(i=0;i<G.numVertices;i++){
dist[i]=getWeight(G,i,v);//区别于Dijkstra
if(i!=v&&dist[i]<maxWeight)path[i]=v;
else path[i]=-1;
}
for(i=0;i<G.numVertices;i++){
if(i!=v){
min=maxWeight;u=v;
for(j=0;j<G.numVertices;j++)
if(s[j]==false&&dist[j]<min){
u=j;
min=dist[j];
}
s[u]=true;
for(j=0;j<G.numVertices;j++)
if(s[j]==false&&dist[j]>getWeight(j,u)+dist[u]){
dist[j]=getWeight(j,u)+dist[u];//区别于Dijkstra
path[j]=u;
}
}
}
}