作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助**給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可能多的救援隊。
輸入格式:
輸入第一行給出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 600 1 3
hint:dijkstra找最短路,只不過在找最短路的時候還要更新一下其他的值...
一開始我寫dijkstra的時候沒有加標記陣列,就wa了,我自己想想感覺好像dijkstra不需要標記陣列的呀。。。問了大佬才知道要標記陣列,反正我現在也還沒想明白為什麼要標記陣列(我明明是符合
條件才會更新的啊 更新一下--在李主席的指導下,我手跑了一下自己的**...果然發現問題了,同乙個點pop多次導致了重複計數,當然如果只是求最短路徑就不存在這種問題)
...先記著,以後標記就是了
自己的手跑過程,字有點醜...但是差不多就是這個意思 -- 當乙個點有多條最短路徑的時候並且這個點是起點到終點的最短路徑的經過點時,就會導致重複計數!
1 #include2using
namespace
std;
3const
int inf=0x3f3f3f3f;4
int cure[505], d[505], num[505], frt[505], u[505], done[505];5
bool visit[505
];6 priority_queueint, int> >que;
7 vectorint, int> > g[505];8
9void print(int
x)14
print(frt[x]);
15 cout<
"<
1718
intmain()
28 frt[s]=-1;29
for(int i=0; i)
34 cure[s]=u[s];
35 num[s]=1
;36 d[s]=0
;37 que.push(make_pair(-d[s], s));
38while
(que.size())else
if(d[v]==d[now]+g[now][i].second)
56 que.push(make_pair(-d[v], v));57}
58}59}
60 cout
"61print(d);
62 cout<
63return0;
64 }
L2 001 緊急救援
這道題就是一道最短路 dijkstra演算法 將模板稍作修改就行了,就是再另外加乙個記錄路線條數的陣列 即當路的長度與下乙個需要判斷的 節點的長度相等時路線就相加 和乙個記錄每個節點在最短路基礎上的車的總數量的陣列,然後就ok了,如下 include include include define m...
L2 001 緊急救援
作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助 給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可能多的救援隊。輸入格式 ...
L2 001 緊急救援
l2 001.緊急救援 作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助 給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可...