作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助**給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可能多的救援隊。
輸入格式:
輸入第一行給出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
using
namespace std;
const
unsigned
int inf =
10000
;int**
getmap
(int numcity,
int numroad)
for(
int i =
0; i < numcity; i++)}
for(
int i =
0; i < numroad; i++
)return map;
}//path存放最短路徑,weight存放結點消防力量,numline為最短路徑的條數
intdijkstra
(int
** map,
int numcity,
int*path,
int*weight,
int start,
int end,
int&numline)
//初始化起始節點的路徑距離為0,最大消防力量為本身,前乙個結點為-1,到此的最短路徑條數為一條
lowcast[start]=0
; w[start]
= weight[start]
; path[start]=-
1;num[start]=1
;for
(int i =
0; i < numcity; i++)}
collect[v]
=true
;for
(int j =
0; j < numcity; j++
)else
if(collect[j]
==false
&& lowcast[j]
==(lowcast[v]
+ map[v]
[j]))}
}}numline = num[end]
;int temp = w[end]
;//防止記憶體洩漏而設立的乙個臨時變數。
delete
num;
delete
collect;
delete
lowcast;
delete
w;return temp;
}//遞迴從後往前列印輸出路徑
void
printpath
(int
*path,
int end)
printpath
(path, path[end]);
cout <<
" "<< end;
}int
main()
L2 001 緊急救援 (25 分)
作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助 給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可能多的救援隊。輸入第一行...
L2 001 緊急救援 (25 分
l2 001 緊急救援 25 分 作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助 給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路...
L2 001 緊急救援 (25 分
最短路因為還要求最短路徑的個數和最大救援人數 對於每個節點和每個節點的前乙個節點,理想的方法是和藍橋杯第五題一樣,結構體裡增加三個記錄資訊,這道題就是要增加乙個最短路徑的個數和當前最大救援隊數的資訊和每個節點的前乙個節點。但我們存圖的方式不是存點,而是存邊,所以只能額外開乙個陣列tot,記錄起始點到...