7 9 旅遊規劃 25分

2021-10-04 07:50:30 字數 1604 閱讀 2045

有了一張自駕旅遊路線圖,你會知道城市間的高速公路長度、以及該公路要收取的過路費。現在需要你寫乙個程式,幫助前來諮詢的遊客找一條出發地和目的地之間的最短路徑。如果有若干條路徑都是最短的,那麼需要輸出最便宜的一條路徑。

輸入格式:

輸入說明:輸入資料的第1行給出4個正整數n、m、s、d,其中n(2≤n≤500)是城市的個數,順便假設城市的編號為0~(n−1);m是高速公路的條數;s是出發地的城市編號;d是目的地的城市編號。隨後的m行中,每行給出一條高速公路的資訊,分別是:城市1、城市2、高速公路長度、收費額,中間用空格分開,數字均為整數且不超過500。輸入保證解的存在。

輸出格式:

在一行裡輸出路徑的長度和收費總額,數字間以空格分隔,輸出結尾不能有多餘空格。

輸入樣例:

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演算法。

設源點為s,目標點為d。此題中比dijkstra演算法多考慮的一點是當路徑長度相同時,比較路徑的收費**,所以原演算法有兩點改變。第一點是增加乙個sum陣列去儲存到源點的總收費**;第二點是在演算法中更新點的距離時,若新增點後距離相等,則去比較**,若**小則更新為較小的**。

注意:

二維陣列的初始化不能直接寫成int g[10][10] = ,這樣不能把二維陣列中所有元素初始化成100啊啊啊。如果不想寫迴圈可以用fill()函式,fill()在 algorithm的標頭檔案裡,用語句fill(g[0],g[0]+10*10,100)可以將此二維陣列所有元素初始化成100.

#include

#include

using

namespace std;

const

int inf =

10000000

;const

int max =

500;

int n,g1[max]

[max]

;int g2[max]

[max]

;int d[max]

;int sum[max]

;bool vis[max]=;

void

dijkstra

(int s,

int d)}if

(u==-1

)return;if

(u==d)

return

; vis[u]

=true

;for

(int v =

0;v)else

if(g1[u]

[v]+d[u]

==d[v])}

}}}}

intmain()

dijkstra

(s,d)

; cout<<<

' '<;}

7 9 旅遊規劃 (25 分)

題目鏈結 這個題跟個板題差不多,跌死啦演算法,暑假第一周學過,當時學的挺明白的,現在就都忘了,又重新看了看網課,不錯,稍微看一點就行了,dij用來計算兩個點的最短路徑,就是不斷找最短的路,然後一次次的更新就行了。哎 怎麼都忘了 這個題我弄了個結構體就來存路長和過路費,然後跟板子一樣。還有今天大學的運...

7 9 旅遊規劃 (25 分)

有了一張自駕旅遊路線圖,你會知道城市間的高速公路長度 以及該公路要收取的過路費。現在需要你寫乙個程式,幫助前來諮詢的遊客找一條出發地和目的地之間的最短路徑。如果有若干條路徑都是最短的,那麼需要輸出最便宜的一條路徑。輸入說明 輸入資料的第1行給出4個正整數n m s d,其中n 2 n 500 是城市...

7 9 旅遊規劃 25 分

有了一張自駕旅遊路線圖,你會知道城市間的高速公路長度 以及該公路要收取的過路費。現在需要你寫乙個程式,幫助前來諮詢的遊客找一條出發地和目的地之間的最短路徑。如果有若干條路徑都是最短的,那麼需要輸出最便宜的一條路徑。輸入說明 輸入資料的第1行給出4個正整數n m s d,其中n 2 n 500 是城市...