農民john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區不連通。這樣,農民john就有多個牧區了。
john想在農場裡新增一條路徑(注意,恰好一條)。對這條路徑有以下限制:
乙個牧場的直徑就是牧場中最遠的兩個牧區的距離(本題中所提到的所有距離指的都是最短的距離)。考慮如下的有5個牧區的牧場,牧區用「*」表示,路徑用直線表示。每乙個牧區都有自己的座標:
這個牧場的直徑大約是12.07106, 最遠的兩個牧區是a和e,它們之間的最短路徑是a-b-e。
這裡是另乙個牧場:這兩個牧場都在john的農場上。john將會在兩個牧場中各選乙個牧區,然後用一條路徑連起來,使得連通後這個新的更大的牧場有最小的直徑。
注意,如果兩條路徑中途相交,我們不認為它們是連通的。只有兩條路徑在同乙個牧區相交,我們才認為它們是連通的。
輸入檔案包括牧區、它們各自的座標,還有乙個如下的對稱鄰接矩陣:
a b c d e f g ha 0 1 0 0 0 0 0 0
b 1 0 1 1 1 0 0 0
c 0 1 0 0 1 0 0 0
d 0 1 0 0 1 0 0 0
e 0 1 1 1 0 0 0 0
f 0 0 0 0 0 0 1 0
g 0 0 0 0 0 1 0 1
h 0 0 0 0 0 0 1 0
輸入檔案至少包括兩個不連通的牧區。
請程式設計找出一條連線兩個不同牧場的路徑,使得連上這條路徑後,這個更大的新牧場有最小的直徑。
第1行: 乙個整數n (1 <= n <= 150), 表示牧區數第2到n+1行: 每行兩個整數x,y (0 <= x ,y<= 100000), 表示n個牧區的座標。注意每個 牧區的座標都是不一樣的。
第n+2行到第2*n+1行: 每行包括n個數字(0或1) 表示如上文描述的對稱鄰接矩陣。
只有一行,包括乙個實數,表示所求答案。數字保留六位小數。
8
1010
1510
2010
1515
2015
3015
2510
3010
01000000
10111000
01001000
01001000
01110000
00000010
00000101
00000010
22.071068
r2=min(mdis[i]+mdis[j]+dis[i,j])
re=max(r1,r2)
這樣的**實現起來比較簡單,裡面會加注釋:
#include
#include
#include
#include
using
namespace std;
long
long n,m;
double a[
201]
[201
],v[
100010];
char map[
200]
[200];
intmain()
memset
(a,100
,sizeof
(a))
;for
(int i=
1;i<=n;i++)}
}//輸入都懂
double r1=
0,r2=
100000000.0
;for
(int k=
1;k<=n;k++
)for
(int i=
1;i<=n;i++
)for
(int j=
1;j<=n;j++)if
(i!=j&&j!=k&&i!=k&&a[i]
[j]>a[i]
[k]+a[k]
[j])a[i]
[j]=a[i]
[k]+a[k]
[j];
//floyed求最短路都懂
for(
int i=
1;i<=n;i++
) v[i]
=maxx;
r1=max(r1,v[i]);
}//乙個是自己的最長直徑
for(
int i=
1;i<=n;i++)}
}//乙個是把兩點連起來的最長直徑
printf
("%0.6lf"
,max
(r1,r2));
//求最大:很多人會問為什麼,應為可能新連的點可能還沒原來的大(乙個牧場),所以取個最大。
}
#include
#include
#include
#include
using
namespace std;
long
long n,m;
double a[
201]
[201
],v[
151]
;double dis[
151]
[151];
//用來存圖
int v1[
151]
;char map[
200]
[200];
void
lzh(
int x)
dis[x]
[x]=0;
v1[x]=1
;for
(int i=
1;iif(k==0)
continue
; v1[k]=1
;for
(int j=
1;j<=n;j++)}
}double maxx=0;
for(
int i=
1;i<=n;i++)}
v[x]
=maxx;
}int
main()
memset
(a,100
,sizeof
(a))
;for
(int i=
1;i<=n;i++)}
}double r1=
0,r2=
100000000.0
;for
(int i=
1;i<=n;i++
)/*for(int i=1;i<=n;i++)
v[i]=maxx;
r1=max(r1,v[i]);
}*/for(
int i=
1;i<=n;i++)}
}printf
("%0.6lf"
,max
(r1,r2));
}
洛谷P1522牛的旅行 多源最短路
題目 或者 自建oj,歡迎光臨 分析 step1 用floyed求出任兩點最短路徑 step2 求出同一聯通塊中任一點可以到達的最遠距離,記作maxdis i 並求出maxdis i 的最大值maxx1 step3 列舉不聯通的兩個點,求出maxdis i maxdis j i,j間的距離 中的最小...
牛客練習賽24 E 青蛙(最短路)
有乙隻可愛的老青蛙,在路的另一端發現了乙個黑的東西,想過去一 竟。於是便開始踏上了旅途 一直這個小路上有很多的隧道,從隧道的a進入,會從b出來,但是隧道不可以反向走。這只青蛙因為太老了,所以很懶,現在想請你幫幫慢,問他最少需要幾步才可以到達對面。將小徑看作一條數軸,青蛙初始在0上,這只青蛙可以向前跳...
乙個人的旅行(最短路)
problem description input 輸入資料有多組,每組的第一行是三個整數t,s和d,表示有t條路,和草兒家相鄰的城市的有s個,草兒想去的地方有d個 接著有t行,每行有三個整數a,b,time,表示a,b城市之間的車程是time小時 1 a,b 1000 a,b 之間可能有多條路 接...