L2 001 緊急救援 改寫最短路 路徑還原

2021-09-14 05:09:43 字數 1665 閱讀 3455

作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助**給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可能多的救援隊。

輸入第一行給出4個正整數n、m、s、d,其中n(2≤n≤500)是城市的個數,順便假設城市的編號為0 ~ (n−1);m是快速道路的條數;s是出發地的城市編號;d是目的地的城市編號。

第二行給出n個正整數,其中第i個數是第i個城市的救援隊的數目,數字間以空格分隔。隨後的m行中,每行給出一條快速道路的資訊,分別是:城市1、城市2、快速道路的長度,中間用空格分開,數字均為整數且不超過500。輸入保證救援可行且最優解唯一。

第一行輸出最短路徑的條數和能夠召集的最多的救援隊數量。第二行輸出從s到d的路徑中經過的城市編號。數字間以空格分隔,輸出結尾不能有多餘空格。

輸入樣例:

4 5 0 3

20 30 40 10

0 1 1

1 3 2

0 3 3

0 2 2

2 3 2

輸出樣例:

2 60

0 1 3

題意:題解:

除了要儲存d為每個點的最短路之外, 也要存一下每個點的最多救援隊數量和路徑的條數

除了在d[u]+g[u][v] < d[v]要更新以上資訊之外, 在相等的時候同樣需要更新救援隊數量和路徑的條數

這道題建議用n^2的dijkstra來寫, 堆優化版本需要對queue的排序進行重新定義, 較為麻煩

#include

#include

#include

#include

using

namespace std;

#define ms(x, n) memset(x,n,sizeof(x));

typedef

long

long ll;

const

int inf =

1<<30;

const ll maxn =

510;

int n, m, s, d, g[maxn]

[maxn]

, w[maxn]

;bool used[maxn]

;int d[maxn]

, pre[maxn]

, num[maxn]

, sw[maxn]

;//num[i]為到達i的最短路徑條數, sw[i]為救援隊數量

void

dijkstra()

else

if(d[u]

+g[u]

[v]== d[v])}

}}}}

void

printpath

(int v)

printpath

(pre[v]);

cout <<

" "<< v;

}int

main()

dijkstra()

; cout << num[d]

<<

" "<< sw[d]

<< endl;

printpath

(d);

return0;

}

L2 001 緊急救援(最短路)

題目鏈結 找出最短路中人數和最大的一條,輸出對應路徑,並求出最短路個數。一題最短路的處理題,在最短路模板上加上人口的數量和路徑數的處理。具體看 更新點的部分。include include include include include include using namespace std con...

L2 001 緊急救援 最短路

時間限制 200 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當...

L2 001 緊急救援 最短路

題意 作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助 給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可能多的救援隊。輸入...