矩陣乘法與鄰接矩陣


矩陣乘法與鄰接矩陣

矩乘結合律的證明 \(:\)

\[\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}=\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}^m\min(A_{x,i},B_{i,y}) \]

直接套用上面的結論即可.

參考文獻 \(:\) 2008年國集論文(ACM Paper):矩陣乘法在信息學中的應用--余華程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM