題目:作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助**給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可能多的救援隊。
輸入:輸入第一行給出4個正整數n、m、s、d,其中n(2≤n≤500)是城市的個數,順便假設城市的編號為0 ~ (n−1);m是快速道路的條數;s是出發地的城市編號;d是目的地的城市編號。
第二行給出n個正整數,其中第i個數是第i個城市的救援隊的數目,數字間以空格分隔。隨後的m行中,每行給出一條快速道路的資訊,分別是:城市1、城市2、快速道路的長度,中間用空格分開,數字均為整數且不超過500。輸入保證救援可行且最優解唯一。
輸出:第一行輸出最短路徑的條數和能夠召集的最多的救援隊數量。第二行輸出從s到d的路徑中經過的城市編號。數字間以空格分隔,輸出結尾不能有多餘空格。
分析:最短路問題,注意輸出的是最短路條數(不是最優路徑條數)
所以只要路徑最短即可(單獨記錄)。
#include
#include
#include
#define ll long long
const
int inf =
0x3f3f3f3f
;const
int n=
1e5+50;
int pace[
10000];
//記錄路徑條數
int dis[
1000];
int w[
1000];
int mp[
1000][
1000];
int pre[
1000];
int vis[
1000];
int num[
1000];
//儲存前面節點最大人數
int a[
1000];
using
namespace std;
intmain()
for(
int i=
0;ifor(
int i=
0;idis[s]=0
; vis[s]=1
; pre[s]=-
1;//dijkstra
for(
int i=
0;ivis[u]=1
; num[u]
=num[pre[u]
]+w[pre[u]];
for(
int v=
0;v)elseif(
!vis[v]
&&dis[v]
==dis[u]
+mp[u]
[v])}}
}int tot=0;
for(
int i=e;i!=-1
;i=pre[i]
)printf
("%d %d\n"
,pace[e]
,num[e]
+w[e]);
for(
int i=tot-
1;i>=
0;i--
)return0;
}
PTA 城市間緊急救援
作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助 給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可能多的救援隊。輸入第一行...
7 35 城市間緊急救援(25 分)
7 35 城市間緊急救援 25 分 作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助 給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一...
7 1 城市間緊急救援 (25 分)
作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助 給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可能多的救援隊。輸入第一行...