PTA7 9 旅遊規劃 25 分

2021-09-29 21:42:23 字數 1666 閱讀 1471

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

輸入格式:

輸入說明:輸入資料的第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

首先我們來分析一下這個題目:

1;它需要求最短路徑的長度:那麼我們就不需要想其它的東西,直接floyd演算法算出你所需要的兩個城市之間的最短路徑長度就行了,即使它有多條最短路徑但它們的最短長度肯定都是一樣的,所以你直接用floyd演算法進行計算就行了,不需要考慮其它。其次它還要我們輸出收費總額

為了表示方便我們用l1來表示i j兩城市直接的距離 用l2來表示經過中間城市k,i->k k->j的距離 c1來表示直接走i j兩城市所要花的錢 用c2來表示經過中間城市k,即k,i->k k->j所要花費的錢,用scost來表示來表示最終總共要花的錢

2:求收費總額:這個我們需要分情況來討論

1:當路徑長度l1>l2時 毫無疑問我們的需要花費的錢肯定是要跟著更小的距離走的,因為距離是第一優先順序,所以我們不用考慮它的錢是貴還是便宜,所以此時mcost+=c2;

(在我的程式表現為p[i][j](我用的p[i][j]來表示i->j的花費)=p[i][k]+p[k][j]

2:其次當路徑長度l1=l2時這時候就要看那個路徑的收費少了,如果c2c1那麼此時我們是不需要寫的,因為它表現為p[i][j]=p[i][j]

而這時無意義的。

3:當l1#include

#include

#define t 500

#define inf 999999

intmain()

}//初始化最短距離和收費額二維陣列,當然用乙個三維陣列p[n][n][2]也是可以的

int c1,c2,ml,pay;

//城市1 城市2 高速公路長度 收費額

for(

int i=

0;i++i)

for(

int k=

0;k++k)

elseif(

((g[i]

[k]+g[k]

[j])

==g[i]

[j])&&(

(p[i]

[k]+p[k]

[j])

[j]))}

}}}printf

("%d %d"

,g[s]

[d],p[s]

[d])

;//輸出結果

}

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 是城市...