經過N條邊的最短路

2022-08-17 13:18:08 字數 896 閱讀 9271

求經過n條邊的最短路 (2 ≤ n ≤ 1,000,000)

倍增floyd,主體是矩陣乘法。考慮乙個x邊的路徑矩陣和y邊的路徑矩陣,兩個矩陣用類似floyd的方法結合起來,就得到x+y邊的路徑矩陣,現在想要得到n邊路徑矩陣

然後就是「快速冪」的思想啦...把n拆成2的冪,只需要log(n)次矩陣乘法就搞定

偽floyd o(n^3),所以總的時間複雜度o(logn*n^3) 其中n是點的個數 由於最多100個邊,所以n最大200

雖說只有最多200個點,然而點點序號卻很迷的到了1000,所以用了離散化,把點的序號對映到1~200範圍

答案矩陣開始時候應該為單位矩陣 在這個倍增floyd定義下 單位矩陣應該是跡為0 其他值為正無窮

#include#include

#include

using

namespace

std;

const

int maxn = 207, inf = 0x3f3f3f3f

;map

m;intcnt, n, t, s, e;

struct

floyd

floyd

operator * (const floyd&b)

}st, ans;

void

quick()

st = st *st;

n >>= 1

; }

}int

main()

for(int i = 1; i <= cnt; i++)

ans.a[i][i] = 0

; quick();

printf("%d

", ans.a[m[s]][m[e]]);

return0;

}

最短路(SPFA 反向建邊)

題目描述 給定乙個 nnn 點 mmm 邊的有向帶權圖表示一座城市,起點為 111 送餐小哥需要給 nnn 個客戶送外賣,第 iii 個客戶的家在第 iii 號點。由於他的車子容量很小,所以一次只能容納乙份外賣,所以送達外賣之後就要回到起點取新的外賣送下一單,直到全部送到位置。有向圖保證聯通。外賣小...

《Frogger》最短路之最長邊

題意就不贅述了.想講一講思路 我們要求得最長邊裡的最短.就要不斷去更新,到當前位置的最長邊裡的最短邊是什麼.所以也就是,我們的距離陣列中儲存的是,到當前點的所有路徑中的最長邊裡的最短邊.include include include include include include include i...

最短路徑樹 刪邊

題意 n nn 個點,m mm條邊的無向圖,令dis disdi s為每對結點的最短路長度的和。例如n 2 n 2n 2時,dis d 1 1 d 1,2 d 2,1 d 2,2 dis d 1,1 d 1,2 d 2,1 d 2,2 dis d 1,1 d 1 2 d 2,1 d 2,2 現在要求...