假設一個$N$個結點的無向圖
我們用 $G[u][v]=G[v][u]=1$ 表示 $ u$ 到 $ v$ 有連邊, 否則 $ G[u][v]=G[v][u]=0 $
如果用這個鄰接矩陣自乘會得到什么呢
模擬矩乘的運算有 $ G^{2}[u][v]=\sum \limits_{i=1}^{n} G[u][i] * G[i][v]$ 也就是說 $ G^{2}[u][v]$ 是表示圖上 $ u$ 到 $ v$ 恰好經過兩條邊的路徑的條數的矩陣
我們可以把原始鄰接矩陣 G[u][v] 看作為
表示圖上 $ u$ 到 $ v$ 恰好經過一條邊的路徑條數的矩陣 那么 $ G^{2}[u][v]=\sum \limits_{i=1}^{n} G[u][i] * G[i][v]$ 顯然就是運用了乘法原理與加法原理
再考慮 $ G^{3}[u][v]$ 呢
由 $ G^{3}$ 的計算過程 $ G^{3}[u][v]=\sum_{i=1}^{n} \sum \limits_{j=1}^{n} G[u][i] * G[i][j] * G[j][v]$ 同理可知其表示為圖上 $ u$ 到 $ v$ 恰好經過三條邊的路徑條數的矩陣 或者我們也可以將其看作 $ G^{3}=G^{2} * G$ 理解,其本質是相同的
由上述不難發現該性質對於一般的正整數k都是成立的
即 $ G^{k}[u][v]$ 是表示圖上 $ u$ 到 $ v$ 恰好經過 $K$ 條邊的路徑條數的矩陣
也就是說
如果需要在某個圖上求 $ u$ 到 $ v$ 恰好經過$ K$ 條邊的路徑的條數 我們完全可以使用矩陣快速帛來優化這個計算過程
當然,這個性質對於有向圖以及有重邊的圖同樣適用 對於有重邊的圖,把初始矩陣 $ G[u][v]$ 改成記錄 $ u, v$ 之前邊的條數即可
Example
a=[ [0,1,1,1], [1,0,0,1], [1,0,0,1], [1,1,1,0], ] A = torch.tensor(a) torch.mm(A,A) tensor([[3, 1, 1, 2], [1, 2, 2, 1], [1, 2, 2, 1], [2, 1, 1, 3]]) torch.mm(torch.mm(A,A),A) tensor([[4, 5, 5, 5], [5, 2, 2, 5], [5, 2, 2, 5], [5, 5, 5, 4]])