題目描述
有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
21 2 3
#define _crt_secure_no_warnings
#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
#define maxn 1008
struct node ;
int n, m;
vectoradj[maxn];//鄰接表
int pre[maxn];//記錄到達結點v的最短路徑中,v的前驅u
int d[maxn];//記錄單源最短距離
int num[maxn];//記錄spfa結點入隊次數
bool inq[maxn];//判斷結點是否在spfa演算法的佇列中
const int inf = 0x3fffffff;
//在spfa演算法中,佇列中的結點是:剛剛被優化最短距離的結點,
//而優化了乙個結點u的最短距離,與這個結點相連的其他結點v的最短距離就可能可以被繼續優化
//所以我們遍歷其他結點v,找到可以優化的結點,然後繼續放進佇列inqueue
bool spfa(int s)
}//u < pre[v]是關鍵,因為題目要求找到字典最小的路徑
//所以我們要求路徑長度相同的條件下,每個結點的序號盡可能小
else if (d[u] + dis == d[v] && u < pre[v])
} }return true;
}void dfs(int v)
dfs(pre[v]);
cout << " " << v;
}void init()
}int main()
spfa(start);
if (d[dest] != inf)
else
} return 0;
}
Codeup最短路徑 最短路徑問題
給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t 起點s,...
Codeup最短路徑 最短路徑
n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離。第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道路,接下來m行兩個整數,表示相連的兩個城市的編號。n 1行,表示0號城市到其他城市的最短路,如果無法到達,輸出...
演算法筆記 問題 D 最短路徑
題目描述 有n個城市m條道路 n 1000,m 10000 每條道路有個長度,請找到從起點s到終點t的最短距離和經過的城市名。輸入輸入包含多組測試資料。每組第一行輸入四個數,分別為n,m,s,t。接下來m行,每行三個數,分別為兩個城市名和距離。輸出每組輸出佔兩行。第一行輸出起點到終點的最短距離。第二...