• 矩阵乘法与邻接矩阵

    矩阵乘法与邻接矩阵

    矩乘结合律的证明 \(:\)
    \[\begin{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]\right) \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]\right) \\ &=(\mathbf{A}(\mathbf{B} \mathbf{C}))[i, j] \end{aligned}\]

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

    引例 \(1:\) [TJOI2017]可乐

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

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

    这个问题怎么做呢?

    不考虑 \(Dp\) .

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

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

    \[G'_{a,b} = \sum_{i=1}^m{G_{a,i}\times 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'\times G\]

    \[G''_{a,b}=\sum_{i=1}^n\sum_{j=1}^n{G_{a,i}\times G_{i,j}\times 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}=\sum_{i=1}^m{min(A_{x,i},B_{i,y})}\]

    容易发现,这个矩乘同样具有结合律.(可以从 \(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}^m\{min(A_{x,i},B_{i,y})\}\]

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

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

    相关文章
    相关标签/搜索
    管家婆精选六肖期期准 六枝特区| 凤翔县| 霍邱县| 湟中县| 大理市| 大姚县| 鱼台县| 平阴县| 弥渡县| 临安市| 巩义市| 山阳县| 上虞市| 奉贤区| 永顺县| 永丰县| 五常市| 双桥区| 丹江口市| 夏邑县| 乌海市| 甘谷县| 红安县| 勐海县| 定兴县| 伊川县| 贡觉县| 镇沅| 石阡县| 湟源县| 靖远县| 辛集市| 清原| 富锦市| 吴忠市| 禹州市| 伊春市| 会同县| 故城县| 台山市| 崇信县| 清苑县| 灌阳县| 徐闻县| 黄平县| 荥经县| 田东县| 庐江县| 吉木萨尔县| 秦皇岛市| 佛山市| 凌源市| 安化县| 崇信县| 汽车| 西贡区| 太保市| 孟村| 汝州市| 荥阳市| 北安市| 桓仁| 宝应县| 汉中市| 蚌埠市| 平利县| 临邑县| 黄龙县| 杭锦后旗| 湘潭市| 南投县| 棋牌| 刚察县| 兴海县| 江达县| 凯里市| 宝丰县| 岱山县| 呼玛县| 湾仔区| 兴业县| 馆陶县| 莱阳市| 松潘县| 凉山| 大兴区| 浏阳市| 西畴县| 镇雄县| 永川市| 犍为县| 通山县| 江山市| 顺义区| 遵义县| 新巴尔虎左旗| 望都县| 乐山市| 阜城县| 旌德县| 巴南区| 奎屯市| 五常市| 固阳县| 吴桥县| 军事| 宁乡县| 民县| 上饶县| 海安县| 兰考县| 九江县| 天津市| 天等县| 乌审旗| 内黄县| 华坪县| 太原市| 丰镇市| 郧西县| 南涧| 花莲市| 曲阳县| 库尔勒市| 嘉义市| 尼木县| 随州市| 高台县| 蛟河市| 全州县| 津市市| 南溪县| 花莲市| 乌审旗| 牙克石市| 洞头县| 鹤岗市| 克山县| 棋牌| 汕尾市| 苏州市| 犍为县| 朝阳市| 盐亭县| 兴和县| 册亨县| 柘荣县| 荣昌县| 南华县| 平谷区| 日照市| 安远县| 南汇区| 承德县| 顺平县| 兰州市| 湘西| 庐江县| 新源县| 临沭县| 佛坪县| 额尔古纳市| 阿拉善左旗| 营山县| 卢龙县| 浙江省| 四会市| 那曲县| 黑水县| 凤冈县| 资溪县| 巴林左旗| 昌都县| 永安市| 鹿泉市| 云浮市| 鄂伦春自治旗| 仁布县| 孙吴县| 苍溪县| 保山市| 峨山| 万山特区| 琼中| 迁安市| 肇东市| 海兴县| 拉孜县| 醴陵市| 垦利县| 文成县| 万全县| 红原县| 肃北| 体育| 开原市| 桑植县| 西畴县| 汉阴县| 开远市| 红安县| 余姚市| 娱乐| 临高县| 洛宁县| 新巴尔虎左旗| 武鸣县| 交口县| 阳春市| 阳泉市| 商丘市| 清镇市| 宜兰市| 荣成市| 江口县| 甘肃省| 喀喇| 东莞市| 五大连池市| 姜堰市| 前郭尔| 胶南市| 荃湾区| 弋阳县| 奇台县| 尤溪县| 屯昌县| 肇源县| 平江县| 双柏县| 榆林市| 旬阳县| 晋州市| 仪征市| 绥宁县| 五河县| 青河县| 金沙县| 黎川县| 宜兰县| 新安县| 白水县| 太湖县| 信丰县| 岑溪市| 榕江县| 元谋县| 牟定县| 云浮市| 新泰市| 遂平县| 徐州市| 莎车县| 广水市| 沧州市| 甘洛县| 偏关县| 章丘市| 阳朔县| 泸西县| 略阳县| 巴彦淖尔市| 广安市| 阳春市| 嘉善县| 沿河| 雷州市| 蛟河市| 会宁县| 桐梓县| 苏州市| 宁远县| 图木舒克市| 固始县| 巴青县| 大兴区| 滨州市| 小金县| 墨江| 临泽县| 达日县| 青海省| 罗甸县| 资溪县| 广灵县| 岗巴县| 金坛市| 会东县| 巴彦县| 阳东县| 肃南| 宜君县| 陈巴尔虎旗| 蒙自县| 额济纳旗| 襄樊市| 龙南县| 章丘市| 阿荣旗| 武乡县| 钟山县| 石狮市| 苏尼特左旗| 屏边| 新兴县| 昌平区| 政和县| 利川市| 普格县| 临夏市| 延川县| 临夏市| 西藏| 隆子县| 宁晋县| 鄂温| 清镇市| 乳山市| 巴彦淖尔市| 怀柔区| 江安县| 武邑县| 兰考县| 城固县| 新河县| 鹤壁市| 永平县| 边坝县| http://3g.yqo4j6rl3v.fun http://3g.yqo8j5rl7v.fun http://3g.gz1980typec.fun http://3g.gz1980piecec.fun http://3g.yqo8j9rl7v.fun http://3g.yqo0j2rl6v.fun http://3g.gz1980stringc.fun http://3g.gz1980checkc.fun http://3g.yqo0j4rl4v.fun http://3g.gz1980skipc.fun http://3g.yqo5j1rl2v.fun http://3g.bo2020copys.fun http://3g.yqo9j2rl2v.fun http://3g.bo2020notifys.fun http://3g.gz1980puzpc.fun http://3g.yqo3j3rl0v.fun http://3g.bo2020boards.fun http://3g.yqo6j1rl6v.fun