題意:n 個點,r 條邊,問從點 1 到點 n 的次短路為多少
解法:首先明白次短路的計算方法:
到某個定點 v 的次短路要麼為到定點 u 的最短路加上邊 (u,v)的長度;要麼為到定點 u 的次短路加上邊(u,v)長度。
對於第一種情況討論的是在鬆弛時沒有鬆弛的情況,即當 dist[u] > dist[v] + cost(u,v) 時,仍然選擇dist[u]。
第二種情況比較簡單,已經是次短路了,加上一條直接的邊也不會更優。
1struct
edge 4};
5 vector> g(maxn); //更快6
struct dijkstra
15void addedge(int
from, int to, int
weight)
18void dijkstra(int
s) 39
if (dist2[v] > d2 && dist[v] 44}45}
46};
47int
n, r;
48int
main()
58 men.dijkstra(1
);59 cout << men.dist2[n] <60return0;
61 }
次短路問題
次短路問題和最短路問題類似,我們可以想到次短路由什麼轉移而來?對於當前乙個點,其次短路只可能由兩種情況轉移而來 include include include includeusing namespace std const int inf 0x3f3f3f3f const int maxn 1e5...
最短路和次短路問題,dijkstra演算法
1 2 題目大意 3 在乙個有向圖中,求從s到t兩個點之間的最短路和比最短路長1的次短路的條數之和 4 5 演算法思想 6 用a 求第k短路,目測會超時,直接在dijkstra演算法上求次短路 7 將dist陣列開成二維的,即dist v 2 第二維分別用於記錄最短路和次短路 8 再用乙個cnt二維...
次短路小結
次短路有兩種計算方法。對於一條端點為u v的邊,點v的次短路,要麼是點u的次短路加邊權,要麼是點u的最短路加邊權。設兩個陣列,dist1儲存最短路,dist2儲存次短路,則存在下面的等式 d is t2 v mi ndist2 u w dist1 u w end right.dist2 v m in...