矩陣乘法與鄰接矩陣
矩乘結合律的證明 \(:\)
矩陣乘法能進行快速冪運算的原因就是因為它具有結合律.
引例 \(1:\) [TJOI2017]可樂
相信很多人都能想出一個 \(\Theta(t\times m)\) 的做法.(雖然我沒想出來,但這只是因為我菜)
問題簡化一下,如果我們沒有在原地停留和自爆兩個操作,那么就是問從起點出發,走 \(t\) 步的不同路徑數.
這個問題怎么做呢?
不考慮 \(Dp\) .
令該圖的鄰接矩陣是 \(G\) , 那么我們考慮 \(G^2\) 是個什么東西.(此處的冪運算是指矩陣的冪).
我們單獨考慮某一行和某一列的相關運算 \(:\) 令其為 \(G_{a,i}\) 和 \(G_{i,b}\) , 令 \(G'\) 為相乘得到的矩陣,那么會有 \(:\)
容易發現,當且僅當 \(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^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\) .
則定義:
容易發現,這個矩乘同樣具有結合律.(可以從 \(min\) 運算是和 \(+\) 運算具有同樣性質的二元運算符考慮,證明與普通矩乘相同).
那么這樣,我們直接應用引例 \(1\) 中的結論即可解決該題.
引例 \(3:\) 最小最大邊問題
找不到題目了,國集論文沒給題目來源,找不到.
最小最大邊問題 \(:\) 給定一張有向圖,求某兩點間通過邊數恰好為 \(k\) 的路徑,使得最大邊最小.
同樣的熟悉,同樣的問題.
考慮如果沒有長度恰好為 \(k\) 的做法,那么就是把 \(Floyd\) 的核心代碼換成 \(:\)
能否采用與上面相同的方式重定義矩乘呢?答案是肯定的.
令矩陣 \(A\) 和矩陣 \(B\) 相乘的結果為矩陣 \(C\).
則定義 \(:\)
直接套用上面的結論即可.
參考文獻 \(:\) 2008年國集論文(ACM Paper):矩陣乘法在信息學中的應用--余華程