【dijkstra模板】旅游规划 (25 分)
立志用最少的代碼做最高效的表達(dá)
有了一張自駕旅游路線圖,你會(huì)知道城市間的高速公路長度、以及該公路要收取的過路費(fèi)。現(xiàn)在需要你寫一個(gè)程序,幫助前來咨詢的游客找一條出發(fā)地和目的地之間的最短路徑。如果有若干條路徑都是最短的,那么需要輸出最便宜的一條路徑。
輸入格式:
輸入說明:輸入數(shù)據(jù)的第1行給出4個(gè)正整數(shù)N、M、S、D,其中N(2≤N≤500)是城市的個(gè)數(shù),順便假設(shè)城市的編號(hào)為0~(N?1);M是高速公路的條數(shù);S是出發(fā)地的城市編號(hào);D是目的地的城市編號(hào)。隨后的M行中,每行給出一條高速公路的信息,分別是:城市1、城市2、高速公路長度、收費(fèi)額,中間用空格分開,數(shù)字均為整數(shù)且不超過500。輸入保證解的存在。
輸出格式:
在一行里輸出路徑的長度和收費(fèi)總額,數(shù)字間以空格分隔,輸出結(jié)尾不能有多余空格。
輸入樣例:
4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20
輸出樣例:
3 40
dijkstra模板題。
dijkstra求解單源最短路徑的效率非常高。
步驟:
1、初始化(初始化地圖,初始化起點(diǎn)到其他點(diǎn)的距離)
2、調(diào)用dijkstra:首先遍歷起點(diǎn)周圍的所有點(diǎn),找到距它最短的點(diǎn),加入到點(diǎn)集中。 其次更新從點(diǎn)集到其他點(diǎn)的最短距離。
有不懂的地方歡迎評(píng)論區(qū)留言~
#include<iostream> #include<cstdio> using namespace std;const int INF = 0x3f3f3f3f; int ways[505][505][2]; //儲(chǔ)存路徑長度,費(fèi)用 int dist[505], cost[505]; //存儲(chǔ)由st出發(fā)到各點(diǎn)最短路徑及費(fèi)用 bool visit[505] = {false}; int n,m,st,ov;void dijkstra() {visit[st] = true; //先將起始點(diǎn)加入集合。int minpoint;for(int i1 = 0; i1 < n; i1++) {minpoint = n; //編號(hào)為n的城市不存在,st到n距離為inffor(int i = 0; i < n; i++) {if((!visit[i]) && (dist[i] < dist[minpoint])) minpoint = i;}if(minpoint == n) break; //沒找到,證明無連接,結(jié)束循環(huán)visit[minpoint] = true;for(int i = 0; i < n; i++) {//如果該點(diǎn)沒被訪問,且以新加入節(jié)點(diǎn)為路徑遍歷得到的值更小,則更新最小值 if(!visit[i] && (dist[i] > dist[minpoint] + ways[minpoint][i][0])) { dist[i] = dist[minpoint] + ways[minpoint][i][0];cost[i] = ways[minpoint][i][1] + cost[minpoint];}//如果距離相等,但花費(fèi)更小,則更新最小花費(fèi)。 else if(!visit[i] && (dist[i] == dist[minpoint] + ways[minpoint][i][0])&& (cost[i] > cost[minpoint] + ways[minpoint][i][1]))cost[i] = (cost[minpoint] + ways[minpoint][i][1]);} } }//對(duì)地圖初始化,都設(shè)為無限大。 void init_graph() {for(int i = 0; i < n; i++) for(int j = 0; j < n; j++)ways[i][j][0] = ways[i][j][1] = INF; } //對(duì)從起點(diǎn)到任意點(diǎn)的距離初始化。 void init_d_c() {for(int i = 0; i < n; i++) {dist[i] = ways[st][i][0];cost[i] = ways[st][i][1];} }int main() {cin >> n >> m >> st >> ov;int a, b, c, d;init_graph();for(int i = 0; i < m; i++) {cin >> a >> b >> c >> d;ways[a][b][0] = ways[b][a][0] = c;ways[a][b][1] = ways[b][a][1] = d;}init_d_c();dist[n] = INF; //此不存在城市的最短路為INF dist[st] = cost[st] = 0; //到自身的最短路和花費(fèi)為0dijkstra();cout << dist[ov] << ' ' << cost[ov]; return 0; }
耗時(shí)
修煉愛情的心酸
學(xué)會(huì)放好以前的渴望
我們那些信仰 要忘記多難
遠(yuǎn)距離的欣賞 近距離的迷惘
誰說太陽會(huì)找到月亮
別人有的愛
我們不可能模仿
修煉愛情的悲歡
我們這些努力不簡單
快樂煉成淚水
是一種勇敢
幾年前的幻想 幾年后的原諒
為一張臉去養(yǎng)一身傷
別講想念我 我會(huì)受不了這樣… …
總結(jié)
以上是生活随笔為你收集整理的【dijkstra模板】旅游规划 (25 分)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【后两个测试点】地下迷宫探索 (30 分
- 下一篇: 【floyd模板】哈利·波特的考试 (2