3.最短路径的顶点和边松弛操作

松弛:原来用一根橡皮筋连接p和w两点,现在有一点v到w的路径更短,现在把橡皮筋w点的另一端p换成v点,这样缓解橡皮筋紧绷的压力,让其变得松弛。


1)松弛边:  v -> w 意味着先检查从s到w的最短路径是否是先从s 到 v,再由v -> w, 如果是,则更新distTo[w]和EdgeTo[w]的数据。


 private void relax(DirectedEdge e)
    {
        int v = e.from(), w = e.to();
        if (distTo[w] > distTo[v] + e.Weight())  //  当distTo[v] !=double.PositiveInfinity 才可能为TRUE,这时v是目前到到w最短的边
        {
            distTo[w] = distTo[v] + e.Weight();
            edgeTo[w] = e;


            if (pq.contains(w)) pq.decreaseKey(w, distTo[w]);
            else pq.insert(w, distTo[w]);
        }
    }

1)如果distTo[w] > distTo[v] + e.Weight()  意味着最短路径是先从s 到 v,再由v -> w, 所以更新distTo[w]和EdgeTo[w]的数据。

2)如果distTo[w] < distTo[v] + e.Weight()  则边v -> w失效,忽略这条边



注意:以下情况a和b不能比较,虽然感觉a<b,但计算机可不这么认为

 double a = double.PositiveInfinity;
 double b = (double.PositiveInfinity+10);
        print(a>b);  //false
        print(a<b);   //false

print(a==b); //true



2)顶点的松弛

 private void relax(EdgeWeightedDigraph G,int v)
    {
        foreach (DirectedEdge e in G.Adj(v))
        {
            int  w = e.to();
            if (distTo[w] > distTo[v] + e.Weight())
            {
                distTo[w] = distTo[v] + e.Weight();
                edgeTo[w] = e;
            }


        }
       
    }








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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值