BellmanFord算法、多源最短路与矩阵相乘

BellmanFord算法、多源最短路与矩阵相乘

BellmanFord算法与动态规划

相信看到这篇的读者已经对BellmanFord算法有了详细的认识。在这里我就不再赘述了,直接讨论与动态规划的关系。

我们定义 l x m l_{x}^{m} lxm为从源节点到节点x且最多经过m条边的最短路径的距离,为了构建动态规划的状态转移方程,我们必须分析 l x m − 1 l_{x}^{m-1} lxm1 l x m l_{x}^{m} lxm的关系。

为了从 l x m − 1 l_{x}^{m-1} lxm1递推到 l x m l_{x}^{m} lxm,我们有两个选择。第一,继承上一个状态的值,即 l x m − 1 l_{x}^{m-1} lxm1就是 l x m l_{x}^{m} lxm。第二,存在一个中间节点k,使得 l k m − 1 + w k x l_{k}^{m-1}+w_{kx} lkm1+wkx是最小路径距离。两者取最小值即可。最后,我们构建出动态规划方程:

l x m = min ⁡ 1 ≤ k ≤ n { l k m − 1 + w k x } l_{x}^{m} = \min_{1 \leq k \leq n}\{ l_{k}^{m-1} + w_{kx} \} lxm=1knmin{lkm1+wkx}

其中 w k x w_{kx} wkx指的是边 ( k , x ) (k,x) (k,x)的权值。

接下来我们就可以自底向上的进行递推了,我们定义 l 0 l^{0} l0这个数组为,除了 l s 0 l_{s}^{0} ls0为0外其余均为 ∞ \infty ,这也符合最多经过0条边的定义。那我们递推多少次呢,我们来考虑一个最坏情况,那就是一条最短路径包含了图中的所有节点,又因为最短路是一条简单路,因此最多含有 ∣ V ∣ − 1 |V|-1 V1条边。因此,我们只需要递推到 l ∣ V ∣ − 1 l^{|V|-1} lV1即可,即递推 ∣ V ∣ − 1 |V|-1 V1次。

怎么样?是不是对BellmanFord的理解又近了一步。我们继续往下分析。

BellmanFord算法与矩阵向量相乘

BellmanFord与矩阵向量相乘有什么关系呢?我们做一个替换,把 l m l^{m} lm看成是一个向量,把 w i j w_{ij} wij看成是一个矩阵,我们得到 l m l^{m} lm的过程就是向量 l m − 1 l^{m-1} lm1矩阵 w i j w_{ij} wij的操作。我们再进行一次替换,把算子 min ⁡ \min min替换成加法算子,把加法算子 + + +替换成乘法算子 × \times ×,我们改写我们的动态规划方程:

l x m = ∑ 1 ≤ k ≤ n l k m − 1 × w k x l_{x}^{m} = \sum_{1 \leq k \leq n} l_{k}^{m-1} \times w_{kx} lxm=1knlkm1×wkx

怎么样,是不是就是矩阵与向量相乘了。

因此,我们定义向量 l m l^{m} lm最短距离向量,我们把矩阵 w i j w_{ij} wij称为权值矩阵。把 l 0 l^{0} l0称为零最短距离向量,把 l 1 l^{1} l1称为单位最短距离向量

多源最短路与动态规划

我们继续BellmanFord的算法的思想,能不能扩展到多源最短路呢?答案是肯定的,聪明的读者已经想到了,把向量 l x m l_{x}^{m} lxm改为矩阵 l i j m l_{ij}^{m} lijm表示从节点i到节点j最多经过m条边的最短路径。有了上面的经验,我们的动态规划方程就很好写出了:

l i j m = min ⁡ 1 ≤ k ≤ n { l i k m − 1 + w k j } l_{ij}^{m} = \min_{1 \leq k \leq n}\{ l_{ik}^{m-1} + w_{kj} \} lijm=1knmin{likm1+wkj}

有了这个方程,我们就可以递推了。同理,定义 l i j 0 l_{ij}^{0} lij0为当 i = j i=j i=j时为 0 0 0,否则为 ∞ \infty 。特别的, l i j 1 = G i j l_{ij}^{1} = G_{ij} lij1=Gij,其中 G i j G_{ij} Gij是我们的邻接矩阵。因此,如果我们知道我们的邻接矩阵,就可以从 l i j 1 l_{ij}^{1} lij1开始递推,而不必从 l i j 0 l_{ij}^{0} lij0开始。同样的分析方式,也是递推 ∣ V ∣ − 1 |V|-1 V1次。

多源最短路与矩阵相乘

我们也做一个替换,把 l m l^{m} lm看成是一个矩阵,把 w i j w_{ij} wij看成是一个矩阵,我们得到 l m l^{m} lm的过程就是矩阵 l m − 1 l^{m-1} lm1矩阵 w i j w_{ij} wij的操作。我们再进行一次替换,把算子 min ⁡ \min min替换成加法算子,把加法算子 + + +替换成乘法算子 × \times ×,我们改写我们的动态规划方程:

l i j m = ∑ 1 ≤ k ≤ n { l i k m − 1 × w k j } l_{ij}^{m} = \sum_{1 \leq k \leq n}\{ l_{ik}^{m-1} \times w_{kj} \} lijm=1kn{likm1×wkj}

怎么样?是不是就变成矩阵相乘了。因此,我们定义向量 l m l^{m} lm最短距离矩阵,我们把矩阵 w i j w_{ij} wij称为权值矩阵。把 l 0 l^{0} l0称为零最短距离矩阵,把 l 1 = G i j l^{1} = G_{ij} l1=Gij称为单位最短距离矩阵

最终,我们给出松弛的概念,像上面这样,通过一个最短距离矩阵(向量)和权值矩阵进行计算得出下一个状态的最短距离矩阵(向量),我们称这个计算为松弛

多源最短路与矩阵快速幂

可以由数学证明,算子松弛也具矩阵相乘的线性相关性。因此我们能不能使用矩阵快速幂的思维,改进我们的算法呢?

我们通过归纳总结得出:(定义算子 ⋅ \cdot 为松弛算子而不是矩阵相乘)

l 1 = W l 2 = W ⋅ l 1 = W ⋅ W = W 2 l 3 = l 2 ⋅ W = W 3 l 4 = l 2 ⋅ l 2 = W 4 … l^{1} = W \\ l^{2} = W \cdot l^{1} = W \cdot W = W^{2} \\ l^{3} = l^{2} \cdot W = W^{3} \\ l^{4} = l^{2} \cdot l^{2} = W^{4} \\ \dots l1=Wl2=Wl1=WW=W2l3=l2W=W3l4=l2l2=W4

因此,我们就可以通过矩阵快速幂的思维改进我们的算法了。

总结

由此可见,线性代数中矩阵乘法与图论中最短路问题有着抽象的关系,给出我最喜欢的名言总结此文:

Abstractness is the price of generality.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值