Codeup墓地-问题 D: 最短路径
生活随笔
收集整理的這篇文章主要介紹了
Codeup墓地-问题 D: 最短路径
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
有n個城市m條道路(n<1000, m<10000),每條道路有個長度,請找到從起點s到終點t的最短距離和經過的城市名。
輸入
輸入包含多組測試數據。
每組第一行輸入四個數,分別為n,m,s,t。
接下來m行,每行三個數,分別為兩個城市名和距離。
輸出
每組輸出占兩行。
第一行輸出起點到終點的最短距離。
第二行輸出最短路徑上經過的城市名,如果有多條最短路徑,輸出字典序最小的那條。若不存在從起點到終點的路徑,則輸出“can't arrive”。
樣例輸入
3 3 1 3 1 3 3 1 2 1 2 3 1樣例輸出
2 1 2 3 #include <iostream> #include <vector> using namespace std;const int maxn = 1000; const int inf = 1000000000;int n, m, s, t; //n個城市,m條道路,起點s,重點t struct node {int v;int dis;node(int _x, int _y){v = _x;dis = _y;} }; vector<node> adj[maxn]; vector<int> pre[maxn]; vector<int> temp, ans; bool vis[maxn] = {false}; int d[maxn];void dij(int s) {fill(d, d+maxn, inf);d[s] = 0;for(int i = 0; i < n; i++){int u = -1, min = inf;for(int j = 0; j < n; j++){if(vis[j] == false && d[j] < min){u = j;min = d[j];}}if(u == -1) return;vis[u] = true;for(int j = 0; j < adj[u].size(); j++){int v = adj[u][j].v;if(vis[v] == false){if(d[u] + adj[u][j].dis < d[v]){d[v] = d[u] + adj[u][j].dis;pre[v].clear();pre[v].push_back(u);}else if(d[u] + adj[u][j].dis == d[v]){pre[v].push_back(u);}}}} }void dfs(int v) {if(v == s){temp.push_back(v);for(int i = temp.size() - 1; i >= 0; i--){if(ans.size() == 0){ans = temp;}else{if(temp[i] == ans[i]) continue;else if(temp[i] < ans[i]){ans = temp;break;}else if(temp[i] > ans[i]) break;}}temp.pop_back();return;}temp.push_back(v);for(int i = 0; i < pre[v].size(); i++){dfs(pre[v][i]);}temp.pop_back(); }int main() {scanf("%d%d%d%d", &n, &m, &s, &t);for(int i = 0; i < m; i++){int a, b, d;scanf("%d%d%d", &a, &b, &d);adj[a].push_back(node(b,d));adj[b].push_back(node(a,d));}dij(s);if(d[t] == inf) printf("can't arrive");else{printf("%d\n", d[t]);dfs(t);for(int i = ans.size() - 1; i >= 0; i--){printf("%d ", ans[i]);}}return 0; }?每次做一遍出來,都是答案錯誤50%....
排查半天,還是錯誤50%....
未完待解.....(算法虐我千百遍,我待算法如初戀)
總結
以上是生活随笔為你收集整理的Codeup墓地-问题 D: 最短路径的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Codeup-问题 C: 最短路径
- 下一篇: Codeup墓地-问题 A: 还是畅通工