zoukankan      html  css  js  c++  java
  • 矩阵乘法与邻接矩阵

    矩阵乘法与邻接矩阵

    矩乘结合律的证明 (:)

    [egin{aligned}((mathbf{A B}) mathbf{C})[i, j] & \ &=sum_{l=1}^{c}left(sum_{k=1}^{b} mathbf{A}[i, k] mathbf{B}[k, l] ight) mathbf{C}[l, j] \ &=sum_{k=1}^{b} sum_{l=1}^{c} mathbf{A}[i, k] mathbf{B}[k, l] mathbf{C}[l, j] \ &=sum_{k=1}^{b} mathbf{A}[i, k]left(sum_{l=1}^{c} mathbf{B}[k, l] mathbf{C}[l, j] ight) \ &=(mathbf{A}(mathbf{B} mathbf{C}))[i, j] end{aligned} ]

    矩阵乘法能进行快速幂运算的原因就是因为它具有结合律.

    引例 (1:) [TJOI2017]可乐

    相信很多人都能想出一个 (Theta(t imes m)) 的做法.(虽然我没想出来,但这只是因为我菜)

    问题简化一下,如果我们没有在原地停留和自爆两个操作,那么就是问从起点出发,走 (t) 步的不同路径数.

    这个问题怎么做呢?

    不考虑 (Dp) .

    令该图的邻接矩阵是 (G) , 那么我们考虑 (G^2) 是个什么东西.(此处的幂运算是指矩阵的幂).

    我们单独考虑某一行和某一列的相关运算 (:) 令其为 (G_{a,i})(G_{i,b}) , 令 (G') 为相乘得到的矩阵,那么会有 (:)

    [G'_{a,b} = sum_{i=1}^m{G_{a,i} imes G_{i,b}} ]

    容易发现,当且仅当 (G_{a,i})(G_{i,b}) 都不为零,即 (i) 点可连通 (a,b) 两点的时候上式的该项才为 (1) , 否则为零.

    那么所有的这些情况累加起来,就是从 (a)(b) 长度为 (2) 的路径条数.(即走 (2) 步从 (a) 走到 (b) 的方案数,长度是 (2) 是因为经过一个中间点.)

    由此,我们可以得到, (G^2) 得到的矩阵其实表示了任意两点间长度为 (2) 的路径条数.

    那么 (G^3) 是否就表示任意两点间长度为 (3) 的路径条数呢?

    (G'=G^2) , (G'')(G^3). 那么有:

    [G''=G' imes G ]

    [G''_{a,b}=sum_{i=1}^nsum_{j=1}^n{G_{a,i} imes G_{i,j} imes G_{j,b}} ]

    分析方法与上面相同,于是我们归纳结论如下:

    (G) 表示一张图的邻接矩阵表示,那么 (G^i) 表示任意两点间长度为 (i) 的路径条数.

    那么我们就解决了引例的简化问题.

    那么怎么处理引例中的自爆和原地不动呢?

    很简单,原地不动视为自环,自爆就额外建一个虚点,表示自爆,这里要注意的是,不需要从虚点连回原图,因为自爆之后就不能再走了.

    于是我们解决了引例.

    那么矩乘是否仅仅只有这一个用处呢?

    引例 (2:) USACO07NOV Cow Relays

    题目大意 (:) 求从 (s)(t) 经过 (k) 条边的最短路.

    这个问题乍一看很眼熟,似乎就是上一个问题在细节上做一下变换得到.

    但你仔细思考会发现,最短路这个看似平凡的条件竟然不能用加法和乘法解决.

    但其实这也合理,因为我们知道最短路的求法都是以类似于 (Dp) 的松弛操作为核心的,也就是说有一个核心运算 (: min!)

    那么是否可以用矩阵解决这个运算呢?

    考虑 (Floyd) 的过程,其核心代码是 (f_{i,j}=min(f_{i,j},f_{i,k}+f_{k,j}))

    这给了我们一定启发,因为 (Floyd) 的过程和矩乘的过程十分相似.( (Floyd) 的本质是滚掉一维的三维 (Dp))

    于是,我们大胆定义新的矩乘 (:)

    令矩阵 (A) 和 矩阵 (B) 相乘的结果为矩阵 (C) .

    则定义:

    [C_{a,b}=min_{i=1}^m{min(C_{a,b},A_{a,i}+B_{i,b})} ]

    容易发现,这个矩乘同样具有结合律.(可以从 (min) 运算是和 (+) 运算具有同样性质的二元运算符考虑,证明与普通矩乘相同).

    那么这样,我们直接应用引例 (1) 中的结论即可解决该题.

    引例 (3:) 最小最大边问题

    找不到题目了,国集论文没给题目来源,找不到.

    最小最大边问题 (:) 给定一张有向图,求某两点间通过边数恰好为 (k) 的路径,使得最大边最小.

    同样的熟悉,同样的问题.

    考虑如果没有长度恰好为 (k) 的做法,那么就是把 (Floyd) 的核心代码换成 (:)

    [f_{i,j}=max(f_{i,j},min(f_{i,k},f_{k,j})) ]

    能否采用与上面相同的方式重定义矩乘呢?答案是肯定的.

    令矩阵 (A) 和矩阵 (B) 相乘的结果为矩阵 (C).

    则定义 (:)

    [C_{a,b}=max_{i=1}^mmin(A_{x,i},B_{i,y}) ]

    直接套用上面的结论即可.

    参考文献 (:) 2008年国集论文(ACM Paper):矩阵乘法在信息学中的应用--余华程

  • 相关阅读:
    android外存文件读写
    android内存文件读写
    SearchView的使用
    Notification的使用(待完善)-〉添加点击取消,显示优化
    列表Dialog和“确认”、“取消”Dialog
    PopupWindow弹出窗口的使用
    侧拉菜单
    腾讯分析移动设备屏幕分辨率分析报告--转
    git hub使用
    input 原始版,后面修改
  • 原文地址:https://www.cnblogs.com/Equinox-Flower/p/11726324.html
Copyright © 2011-2022 走看看