dijsktra演算法之旅遊規劃(距離 花費)

2021-09-25 15:35:56 字數 1745 閱讀 5283

以城市為結點,公路為邊,每條公路有兩個權重:距離、收費,計算某兩點間的最優路徑。(最優定義為:距離最短,若距離相等則取收費最少的路徑)

sample input:

4 5 0 3

0 1 1 20

1 3 2 30

0 3 4 10

0 2 2 20

2 3 1 20

輸入的第一行為:城市數 公里數 起點 終點

下面每行:城市1 城市2 距離 收費

這是一條典型的dijkstra單源最短路徑問題,只是「最短」的度量擴張到了兩個維度「距離、收費」,相應的在更新最短路徑時有兩種情況要考慮:

① 比原路徑長度更短,則更新

② 與原路徑長度相等,但收費更少,則更新

public

static

void

main

(string[

] args)

g[i]

[i][0]

=0;g

[i][i][1

]=0;

}//插入邊

while

(nroute--!=0

)//dijkstra

int[

] dist =

newint

[ncity]

;//距離

int[

] cost =

newint

[ncity]

;//收費

int[

] path =

newint

[ncity]

;//路徑

path[start]=-

1;//起點沒有前驅

boolean[

] visited =

newboolean

[ncity]

;//判斷是否已經加入已訪問的頂點集

arrays.

fill

(visited,

false);

visited[start]

=true

;//起點預設已訪問

for(int i=

0; i)while

(true)}

if(mindistindex==-1

) visited[mindistindex]

=true

;//加入已訪問的頂點集

//更新最短距離

for(int j=

0; j)else

if(dist[mindistindex]+g

[mindistindex]

[j][0]

==dist[j]

&&!visited[j]

&&cost[mindistindex]+g

[mindistindex]

[j][1]

}}//利用棧逆序路徑,輸出

stack stack =

newstack

<

>()

; int index = end;

while

(index!=-1

)while

(!stack.

isempty()

)}

旅遊規劃 Dijkstra演算法

終於又遇到了一遍過的題目了,果然只要不和007對上我還是可以的。有了一張自駕旅遊路線圖,你會知道城市間的高速公路長度 以及該公路要收取的過路費。現在需要你寫乙個程式,幫助前來諮詢的遊客找一條出發地和目的地之間的最短路徑。如果有若干條路徑都是最短的,那麼需要輸出最便宜的一條路徑。輸入說明 輸入資料的第...

7 9 旅遊規劃

輸入說明 輸入資料的第1行給出4個正整數n m s d,其中n 2 n 500 是城市的個數,順便假設城市的編號為0 n 1 m是高速公路的條數 s是出發地的城市編號 d是目的地的城市編號。隨後的 m行中,每行給出一條高速公路的資訊,分別是 城市1 城市2 高速公路長度 收費額,中間用空格分開,數字...

7 9 旅遊規劃

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