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