非负权值的单目标最短路径(带权有向图)

    数据结构这块内容关于图的内容不少,本文写单源最短路径的兄弟“单目标最短路径”,其思路和方法和单源最短路径相同。

  • 单源最短路径问题提法:给定一个有向带权图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;
                }
        }
    }
}



  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值