1. 程式人生 > 其它 >AcWing 345 牛站

AcWing 345 牛站

題目傳送門

一、前言

本題是求恰好經過\(k\)條邊的最短路徑\(y\)總對這題的講解比較粗糙 ,很多先修知識點(矩陣乘法,矩陣快速冪,利用矩陣快速冪求遞推關係式等)並沒有講解(菜是原罪),這題是可以將很多重要的知識點串起來的好題,仔細分析會大有收穫的。

二、BellmanFord演算法

有邊數限制的最短路徑問題,第一反應自然是\(BellmanFord\)演算法,只需對\(BellmanFord\)演算法的邏輯稍加修改,再吸吸氧應該就可以\(AC\)
為防止正解不突出,另開一篇文章寫一下如何使用\(BellmanFord\)演算法進行解決此問題:

點這裡

三、矩陣快速冪

下面詳細介紹下用矩陣快速冪的方法來求解本題。

1、圖論中的矩陣乘法

g[i][j] = 1表示ij之間存在關聯邊,g[i][j] = 0表示不存在關聯邊,t[i][j]表示從i恰好經過兩條邊到達j路徑條數,很容易得出狀態轉移方程t[i][j] += g[i][k] * g[k][j]k1n,如何得到這個式子的呢?只有ikkj都存在邊的時候,從ik再到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];