作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助**給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可能多的救援隊。
輸入第一行給出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
單源最短路,用dijkstra求。在dijkstra的基礎上加兩個陣列,乙個表示最短路中當前結點的最大救援隊伍數量,乙個表示當前結點的最短路的條數。
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const
int inf =
0x3f3f3f3f
;const
int maxn =
505;
int cost[maxn]
[maxn]
;//鄰接矩陣存邊
bool vis[maxn]
;//標記
int lowc[maxn]
;//最短路
int pre[maxn]
;//最短路中i的父節點
int cnt[maxn]
;//救援隊數量
int upnum[maxn]
;//最短路中當前結點的最大救援隊伍數量
int ans[maxn]
;//答案要求的路徑
int way[maxn]
;//儲存最短路徑的條數
int n, m, s, d, x, y, z;
void
dij(
) lowc[s]=0
; upnum[s]
= cnt[s]
; way[s]=1
;for
(int j =
0; j < n; j++)}
if(k ==-1
)break
; vis[k]
= true;
for(
int i =
0; i < n; i++
)elseif(
!vis[i]
&& lowc[k]
+ cost[k]
[i]== lowc[i])}
}}// for(int i = 0; i < n; i++)
}int
main()
for(
int i =
0; i < n; i++)}
for(
int i =
0; i < m; i++
)dij()
;int t = d, j =0;
while
(t !=-1
)printf
("%d %d\n"
, way[d]
, upnum[d]);
for(
int i = j -
1; i >
0; i--
)printf
("%d\n"
, ans[0]
);return0;
}
L2 001 緊急救援
這道題就是一道最短路 dijkstra演算法 將模板稍作修改就行了,就是再另外加乙個記錄路線條數的陣列 即當路的長度與下乙個需要判斷的 節點的長度相等時路線就相加 和乙個記錄每個節點在最短路基礎上的車的總數量的陣列,然後就ok了,如下 include include include define m...
L2 001 緊急救援
作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助 給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可能多的救援隊。輸入格式 ...
L2 001 緊急救援
l2 001.緊急救援 作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助 給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可...