求經過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 現在要求...