AcWing 345 牛站
阿新 • • 發佈:2022-03-23
一、前言
本題是求恰好經過\(k\)條邊的最短路徑,\(y\)總對這題的講解比較粗糙 ,很多先修知識點(矩陣乘法,矩陣快速冪,利用矩陣快速冪求遞推關係式等)並沒有講解(菜是原罪),這題是可以將很多重要的知識點串起來的好題,仔細分析會大有收穫的。
二、BellmanFord演算法
有邊數限制的最短路徑問題,第一反應自然是\(BellmanFord\)演算法,只需對\(BellmanFord\)演算法的邏輯稍加修改,再吸吸氧應該就可以\(AC\)了
為防止正解不突出,另開一篇文章寫一下如何使用\(BellmanFord\)演算法進行解決此問題:
三、矩陣快速冪
下面詳細介紹下用矩陣快速冪的方法來求解本題。
1、圖論中的矩陣乘法
設g[i][j] = 1
表示i
到j
之間存在關聯邊,g[i][j] = 0
表示不存在關聯邊,t[i][j]
表示從i
恰好經過兩條邊到達j
的路徑條數,很容易得出狀態轉移方程t[i][j] += g[i][k] * g[k][j]
,k
從1
到n
,如何得到這個式子的呢?只有i
到k
和k
到j
都存在邊的時候,從i
到k
再到j
才是剛好經過兩條邊的路徑,所有這種路徑條數的和就是t[i][j]
了,轉化為程式碼的形式就是:
for(int k = 1;k <= n;k++) for(int i = 1;i <= n;i++) for(int j = 1;j <= n;j++) t[i][j] += g[i][k] * g[k][j];