次短路問題

2022-06-05 20:48:10 字數 663 閱讀 3363

題意:n 個點,r 條邊,問從點 1 到點 n 的次短路為多少

解法:首先明白次短路的計算方法:

到某個定點 v 的次短路要麼為到定點 u 的最短路加上邊 (u,v)的長度;要麼為到定點 u 的次短路加上邊(u,v)長度。

對於第一種情況討論的是在鬆弛時沒有鬆弛的情況,即當 dist[u] > dist[v] + cost(u,v) 時,仍然選擇dist[u]。

第二種情況比較簡單,已經是次短路了,加上一條直接的邊也不會更優。

1

struct

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...