PAT L2 001 緊急救援

2021-08-16 17:36:48 字數 1815 閱讀 2894

時間限制

200 ms

記憶體限制

65536 kb

**長度限制

8000 b

判題程式

standard

作者

陳越

作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助**給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可能多的救援隊。

輸入格式:

輸入第一行給出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演算法。設立num[i]和w[i]表示從出發點到i結點擁有的路的條數,以及能夠找到的救援隊的數目~~~當判定dis[u] + e[u][v] < dis[v]的時候,不僅僅要更新dis[v],還要更新num[v] = num[u], w[v] = weight[v]+ w[u]; 如果dis[u] + e[u][v] == dis[v],還要更新num[v] += num[u],而且判斷一下是否權重w[v]更小,如果更小了就更新w[v] = weight[v] + w[u];

再設立乙個pre[i]表示最短路徑的前乙個結點,在dis[u] + e[u][v] <= dis[v]的時候更新pre[v] = u,最後遞迴列印路徑即可

上**:

#include #include using namespace std;

int n, m, c1, c2;

int dis[510], weight[510], e[510][510], num[510], w[510], pre[510];

bool visit[510];

const int inf = 99999999;

void printpath(int v)

printpath(pre[v]);

printf(" %d", v);

}int main()

dis[c1] = 0;

w[c1] = weight[c1];

num[c1] = 1;

for(int i = 0; i < n; i++)

}if(u == -1) break;

visit[u] = true;

for(int v = 0; v < n; v++) else if(dis[u] + e[u][v] == dis[v]) }}

}}

printf("%d %d\n", num[c2], w[c2]);

printpath(c2);

return 0;

}

PATL2 001緊急救援

思路 用dijkstra演算法 每次以最短的路徑為出發點 找下乙個點 如果路徑相同 就比較救援隊數目 關於dijkstra可以參考 include include using namespace std int n,m,s,d int map 501 501 num 501 path 501 len...

pat L2 001 緊急救援(djstra過)

作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助 給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可能多的救援隊。輸入格式 ...

PAT L2 001 緊急救援 最短路徑變形

題目鏈結 題目意思 給出你四個整數n,m,s,d,分別表示有n個城市,城市標號從0 n 1 連線m條路。接下來給你n個數代表第幾個城市有多少救援隊,接下來的m行給出你三個數a b,l 分別代表從城市a到城市b距離l。現在要你輸出總共有幾條最短路徑且最短路徑上的最多的救援隊的數量,並且輸出擁有最多的救...