作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助**給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可能多的救援隊。
輸入格式:
輸入第一行給出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,問題是如何計算最短路徑條數,其實遵循這樣兩條原則:
如果a到b只有一條路可以走,那麼到b的路條數就是到a的條數
如果不是一條路,就把所有的路加起來。
#include
using
namespace std;
int map[
501]
[501];
//記錄圖的邊資訊
int peo[
501]
;//截止走到此處積累的人數
int count[
501]
;//走到此處的方法數
int vis[
501]
;//此點是否已經走過
int path[
501]
;//記錄路徑
int dist[
501]
;int ph[
501]
;//people here:此點的人數
int n,s,d;
void
path
(int d)
;int
main()
} dist[s]=0
;//起點到起點的距離是0
count[s]=1
;//起點到起點一種方式
vis[s]=1
;//將起點放入集合
peo[s]
=ph[s]
;//走到起點的人數就是起點的人數
int c1,c2,len;
//輸入使用
for(
int i=
0;i)//輸入邊的資訊
for(
int i=
0;i//初始化完成
int min=s,minf;
//min存放最小值下標,minf存放最小值
for(
int i=
1;i)//只需要迴圈n-1次,因為每次會挑選乙個最小值,起點已經進入集合
else
for(
int j=
0;jvis[min]=1
;//最小值放入集合
for(
int j=
0;j)else
if(vis[j]==0
&&map[min]
[j]!=
1000000
&&dist[min]
+map[min]
[j]==dist[j]
)//相等,需要看人手}}
}printf
("%d %d\n"
,count[d]
,peo[d]);
path
(d);
printf
("%d"
,d);
return0;
}void
path
(int d)
}
7 35 城市間緊急救援(25 分)
7 35 城市間緊急救援 25 分 作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助 給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一...
7 1 城市間緊急救援 (25 分)
作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助 給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可能多的救援隊。輸入第一行...
7 3 城市間緊急救援 (25 分)
7 3 城市間緊急救援 25 分 作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助 給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路...