毀滅世界的01 城市交通

2022-03-21 07:13:10 字數 2027 閱讀 2567

【描述】

某城市有n(

1<=n<=50

)個街區,某些街區由公共汽車線路相連,如在圖

1中,街區1,

2有一條公共汽車線路相連,且由街區

1至街區

2的時間為

34分鐘。由於街區與街區之間的距離較近,與等車時間相比可忽略不記,所以這個時間為兩趟公共汽車的間隔時間,即平均的等車時間。

由街區1

至街區5

的最快走法為

1-3-5

,總時間為

44分鐘。

現在市**為了提高城市交通質量,決定加開

m(1<=m<=10)

條公共汽車線路。若在某兩個街區

a,b之間加開線路(前提是a、

b之間必須已有線路),則從a到

b的旅行時間縮小為原來的一半(距離未變,只是等車的時間縮短了一半)。例如,若在1,

2之間加開一條線路,則時間變為

17分鐘,加開兩條線路,時間變為

8.5分鐘,以此類推。所有的線路都是環路,即如果由1至

2的時間變為

17分鐘,則由2至

1的時間也變為

17分鐘。

求加開某些線路,能使由城市

1至城市

n的時間最少。例如,在圖

1中,如果

m=2,則改變

1-3,3-5

的線路,總的時間可以減少為

22分鐘。

【輸入格式】

輸入檔名為

city.inp

。第一行為城市數

n與加開線路數m。

第二行至第

n+1行,每行為

n個實數,第

i+1行第

j列表示由城市

i到城市

j的時間。

如果時間為

0,則城市

i不可能到城市j。

注意:輸入資料中,從城市

1到城市

n至少有一條路線。

【輸出格式】

輸出檔名為

city.out.

第一行為由城市

1到城市

n的最小時間

x(保留小數點後兩位)。

第二行至第

m+1行為更改的線路。每行由兩個整數(

x,y)構成。表示將城市

x與城市

y之間增加一條線路。

【樣例輸入】

52034 24 0 0

340 10 12 0

2410 0 16 20

012 16 0 30

00 20 30 0

【樣例輸出】

22.00

1335

【分析】

乍一看…………沒感覺。完全不知道怎麼解決。

開始想圖結構的經典演算法。當想到floyd的時候,突然發現,可以將floyd變化一下,然後就有點資源分配的感覺。於是乙個演算法出來了。第一次提交,50分。小看了下題解,和自己想的一樣。但是就是不知道**錯了。然後,想了一節課。發現動歸過程的g應該從0開始,因為不加汽車也是可以有點之間距離的更新的。動歸陣列f[i][j][k]表示從i到j共加k條所能達到的最短路。方程很好理解。輸出順序題目沒說,我就用最簡單的方法輸出了。恩,ac。

#include #define maxn 60

#define maxm 20

#define maxint 1000000000

double f[maxn][maxn][maxm];

int from[maxn][maxn][maxm][2];

int n,m;

void print(int a,int b,int c)

}int main()

for (int g=1;g<=m;++g)

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

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

if (f[i][j][0]

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,...

城市交通費

城市交通費 問題描述 有 n 個城市,編號 1 n。其中 i 號城市的繁華度為 pi。省內有 m 條可以雙向同行的高速 公路,編號 1 m。編號為 j 的高速公路連線編號為 aj 和 bj 兩個城市,經過高速公路的費用 是 wj。若從城市 x 出發到某城市 y,除了需要繳納高速公路費用,還要繳納 城...