最短路與dfs的結合patL2001

2021-09-11 09:20:51 字數 1498 閱讀 2735

l2-001 緊急救援 (25 分)

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

輸入第一行給出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

這個題的在最短路的條件下,求出可以組織的最多救援人員,同時輸出路徑;首先求出最短路徑,這個作為dfs的條件,用於記錄資料,然後使用陣列來儲存路徑,最後輸出答案。

**如下:

int n, m, s, d, c[505], minlen;

int vis[maxn];

int g[maxn][maxn], dis[maxn], cnt, buf[maxn], ss, path[maxn], ans;

void dijkstra()

} vis[tmp] = 1;

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

} minlen = dis[d];

}void dfs(int u, int len, int sum, int step)

return ;

} for(int i = 0; i > n >> m >> s >> d;

for(int i = 0; i < n; i++)cin >> c[i];

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

} }for(int i = 0; i < m; i++)

dijkstra();

//cout << minlen << endl;

memset(vis, 0, sizeof(vis));

cnt = 0, ans = 0;

vis[s] = 1;

dfs(s, 0, c[s], 0);

cout << cnt << " "

cout << endl;

return 0;

}

昂貴的聘禮 DFS 最短路

description 年輕的探險家來到了乙個印第安部落裡。在那裡他和酋長的女兒相愛了,於是便向酋長去求親。酋長要他用10000個金幣作為聘禮才答應把女兒嫁給他。探險家拿不出這麼多金幣,便請求酋長降低要求。酋長說 嗯,如果你能夠替我弄到大祭司的皮襖,我可以只要8000金幣。如果你能夠弄來他的水晶球,...

套模板的DFS 最短路

最短路 problem description 在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行...

1129 顏色交替的最短路徑(dfs)

1.問題描述 在乙個有向圖中,節點分別標記為 0,1,n 1。這個圖中的每條邊不是紅色就是藍色,且存在自環或平行邊。red edges 中的每乙個 i,j 對表示從節點 i 到節點 j 的紅色有向邊。類似地,blue edges 中的每乙個 i,j 對表示從節點 i 到節點 j 的藍色有向邊。返回長...