城市交通費

2022-02-17 20:01:52 字數 2738 閱讀 6932

城市交通費

【問題描述】

有 n 個城市, 編號 1~n。 其中 i 號城市的繁華度為 pi。 省內有 m 條可以雙向同行的高速

公路, 編號 1~m。 編號為 j 的高速公路連線編號為 aj 和 bj 兩個城市, 經過高速公路的費用

是 wj。 若從城市 x 出發到某城市 y, 除了需要繳納高速公路費用, 還要繳納「城市建設費」

(為從 x 城市到 y 城市所經過的所有城市中繁華度的最大值, 包括 x 和 y 在內) 。

現提出 q 個詢問, 每個詢問給出一組 x 和 y, 你需要回答從 x 出發到 y 城市, 所需要的

最低交通費(高速公路費+城市建設費) 是多少。

【輸入】

第一行三個整數 n,m,q。

第二行 n 個整數, 表示 p1~pn。

接下來 m 行中, 每行 3 個正整數, 第 j 行包含 aj, bj, wj。

隨後 q 行每組兩個正整數 x, y 表示一組詢問。

【輸出】

共 q 行, 為對 q 個問題的回答: x 城市到 y 城市的最小交通費用。

【樣例輸入】

5 7 2

2 5 3 3 4

1 2 3

1 3 2

2 5 3

5 3 1

5 4 1

2 4 3

3 4 4

1 42 3

【樣例輸出】

8 9【資料範圍及約定】

n≤250, m≤20000, q≤10000, pi≤10000, wj≤2000, 保證任意兩個城市可以互相到達。

【樣例說明】

圖中, 代表城市的格仔中第乙個數字是城市編號, 第二個紅色數字是該城市的繁華度。

(1) 從城市 1 到城市 4 的最小交通費用路線是: 1 3 5 4; 公路費是 2+1+1=4; 城市建設費是

max=4; 總交通費用 4+4=8。

(2) 從城市 2 到城市 3 的最小交通費用路線是: 2 5 3; 公路費是 3+1=4; 城市建設費是

max=5; 總交通費用 4+5=9。

由於這個題是多組詢問,顯然要用floyd做,但關鍵是如何處理繁華度這個東西,因為最短路徑和最小繁華度的路徑很有可能不是一條路

我們可以考慮對繁華度進行排序,並記錄下來排序之後每個點對應的編號,然後再跑一遍floyd

但是這樣的正確性是如何保證的?這就要說到floyd的本質思想了

因為floyd的本質其實是dp,我們記f

k,i,j

表示當前情況下從i到j在經過中間點的標號不超過k時的最短路(1~k這些點可以經過也可以不經過),那麼dp的狀態轉移方程就是f

k,i,j

=min(f

k-1,i,j

,fk-1,i,k

+fk-1,k,j)也就是說在經過k和不經過k之中取最大值

那麼對於這道題來說,fk,i,j 就表示在經過繁華度前k小的城市的前提下,從i~j的最短路徑,那麼因為最終的答案要考慮最大繁華度,又由於繁華度是按照從小到大的順序排序的,所以最大繁華度只能在i,j,k 之間選取。

for(int k=1;k<=n;k++)//

floyd列舉中間點

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++)

那麼有的小夥伴(@yy)就要問了,如果我們剛開始沒有用k來更新最短路,那麼下面豈不是還會用k來更新,這不就矛盾了嗎?

其實並不矛盾

當點k不經過的時候,a[i][j]是沒有被更新的,而f[i][j]在取min之前仍然是在經過繁華度前k-1小的城市的前提下,從i~j的最短路徑。

以下分兩種情況

1.p[k]

此時顯然p[k]不會對答案產生影響

2.p[k]>max(p[i],p[j])

此時因為這些城市已經按照繁華度排序了,所以有p[k]>p[k-1],也就是說由於取min,p[k]不會對答案產生影響

所以這種擔心是不成立的

**:

#include#include

#include

#include

#include

using

namespace

std;

int n,m,q,p[300],aj,bj,wj,x,y,f[300][300],a[300][300],top,t[300

];int cmp(int x,int

y)int

main()

//鄰接矩陣存圖,由於毒瘤資料有重複的邊,所以取最小值

for(int i=1;i<=n;i++)

sort(t+1,t+1+n,cmp);//將城市

按照繁華度排序,相當於是開了乙個結構體

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++)

f[i][j]=a[i][j]+max(p[i],p[j]);

//初始化

for(int k=1;k<=n;k++)//

floyd列舉中間點

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++)

for(int i=1;i<=q;i++)

//fclose(stdin);

//fclose(stdout);

return0;

}

SSL 城市交通

有n個城市,編號1 n,有些城市之間有路相連,有些則沒有,有路則當然有乙個距離。現在規定只能從編號小的城市到編號大的城市,問你從編號為1的城市到編號為n的城市之間的最短距離是多少?先輸入乙個n,表示城市數,n小於100。下面的n行是乙個n n的鄰接矩陣map i,j 其中map i,j 0表示城市i...

深搜 城市交通

由於牛奶市場的需求,奶牛必須前往城市,但是唯一可用的交通工具是計程車 教會奶牛如何在城市裡打的 給出乙個城市地圖,東西街區e 1 e 40 南北街區n 1 n 30 製作乙個開車指南給計程車司機,告訴他如何從起點 用s表示 到終點 用e表示 每乙個條目用空格分成兩部分,第乙個部分是方向 n,e,s,...

7 2 最小交通費問題floyed

7 2 最小交通費問題 30分 魔法世界有n n 100 個城市,某些城市之間有公路連線,任意兩個城市可以通過公路直接或間接到達,並且任意有公路連線的兩個場所之間,來回使用的交通工具不一樣,所以費用也不一樣,現從a場所出發去b場所,最後再返回a場所,請設計一條來回最小交通費的線路。輸入格式 第一行有...