作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助**給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可能多的救援隊。
輸入第一行給出\(4\)個正整數\(n、m、s、d\),其中\(n(2 \leqslant n \leqslant 500)\)是城市的個數,順便假設城市的編號為\(0 \sim (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
思路來自fool_one的l2-001 緊急救援
1.本題題意為在所有最短路中尋找一條點權和最大的路徑,並且要求最短路計數和列印路徑;
哇塞,真是大雜燴,單源最短路模板題非你莫屬!2.
設num[v]
為起始點到\(v\)點的最短路條數;
設sum[v]
為起始點到\(v\)點的最大點權和;
設s[v]
為\(v\)點的點權;
設path[v]
為當前最優方案下\(v\)點往前的點;
3.對於通常情況下的dis[v]>dis[u]+w
:
首先是路徑更新dis[v]
代表起始點到\(v\)點的最短路長度,w
為當前邊\(u \rightarrow v\)的邊權;
num[v]=num[u]
,顯然因為當前路徑最優,更新最短路條數;
其次是點權更新sum[v]=sum[u]+s[u]
,理由同上;
之後是路徑更新path[v]=u
,理由同上;
最後將更新點入隊;
4.因為要求最短路計數,所以需要對dis[v]==dis[u]+w
的點進行特判:
顯然有num[v]+=num[u]
(即最短路可以從\(u\)處繼承);
並且,檢查更新sum[v]
是否大於sum[u]+s[v]
,如果sum[v]此處無需入隊,因為當前最短路本身為最優狀態,入隊也會因為vis[v]=1
而無功而返;
5.最後列印路徑,直接從path[d]
往前反推即可;
#include#include#include#include#include#includeusing namespace std;
const int n=505;
int n,m,s,d,s[n],num[n],sum[n],path[n],ans[n],dis[n];
bool vis[n];
vectore[n],w[n];
struct node
};priority_queueq;
void dijkstra());
while(!q.empty()));
}} }
}int main()
L2 001 緊急救援(最短路)
題目鏈結 找出最短路中人數和最大的一條,輸出對應路徑,並求出最短路個數。一題最短路的處理題,在最短路模板上加上人口的數量和路徑數的處理。具體看 更新點的部分。include include include include include include using namespace std con...
L2 001 緊急救援 最短路
時間限制 200 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當...
L2 001 緊急救援 最短路
題意 作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助 給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可能多的救援隊。輸入...