【描述】
某城市有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,除了需要繳納高速公路費用,還要繳納 城...