題目描述農民john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區不連通。現在,john想在農場裡新增一條路徑 ( 注意,恰好一條 )。對這條路徑有這樣的限制:乙個牧場的直徑就是牧場中最遠的兩個牧區的距離 ( 本題中所提到的所有距離指的都是最短的距離 )。考慮如下的兩個牧場,圖1是有5個牧區的牧場,牧區用「*」表示,路徑用直線表示。每乙個牧區都有自己的座標:
圖1所示的牧場的直徑大約是12.07106, 最遠的兩個牧區是a和e,它們之間的最短路徑是a-b-e。 這兩個牧場都在john的農場上。john將會在兩個牧場中各選乙個牧區,然後用一條路徑連起來,使得連通後這個新的更大的牧場有最小的直徑。注意,如果兩條路徑中途相交,我們不認為它們是連通的。只有兩條路徑在同乙個牧區相交,我們才認為它們是連通的。 現在請你程式設計找出一條連線兩個不同牧場的路徑,使得連上這條路徑後,這個更大的新牧場有最小的直徑。
輸入第 1 行:乙個整數n (1 <= n <= 150), 表示牧區數; 第 2 到 n+1 行:每行兩個整數x,y ( 0 <= x,y<= 100000 ), 表示n個牧區的座標。每個牧區的座標都是不一樣的。 第 n+2 行到第 2*n+1 行:每行包括n個數字 ( 0或1 ) 表示乙個對稱鄰接矩陣。 例如,題目描述中的兩個牧場的矩陣描述如下:
a b c d e f g h
a 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
輸入資料中至少包括兩個不連通的牧區。
輸出只有一行,包括乙個實數,表示所求答案。數字保留六位小數。
樣例輸入8
10 10
15 10
20 10
15 15
20 15
30 15
25 10
30 10
01000000
10111000
01001000
01001000
01110000
00000010
00000101
00000010
樣例輸出22.071068 題解
這道題使用的是floyed演算法
有幾個地方需要注意
1、每乙個牧區就是每乙個點,乙個牧場就是連線一片牧區的範圍
2、乙個牧場的直徑就是牧場中最遠的兩個牧區的距離 ( 本題中所提到的所有距離指的都是最短的距離 )。
這句話就是說對於這個圖
直徑應該是a和e(最遠牧區)的ab+be(最短距離),而不是ab+bc+ce
3、程式設計找出一條連線兩個不同牧場的路徑,使得連上這條路徑後,這個更大的新牧場有最小的直徑。
有可能新連線的牧場的直徑沒有原來牧場直徑大,所以我們最後需要乙個比較,將兩片牧場的直徑最大值和連通後所求的牧場最大值進行比較
很多人對這裡有疑問,覺得怎麼會有連通之後比連通之前的距離還要小?我們看一下這個例子
有這樣的4個點。abc相連,是3個牧區,乙個牧場,d自己是乙個牧區乙個牧場,現在連線這兩部分,很顯然應該是連線bd,這樣的話,兩個牧場最近距離應該是0.9,如果不和原牧場相比較,取最大值的話,那最終結果應該是1.9,但我們發現1.9並不是最遠牧區的距離,最終結果應該是2,下面我們執行一下測試資料
我們可以發現最遠牧區距離是2,也印證了我們的結果,需要和原來的兩個牧區比較取最大值,否則可能新的牧場直徑沒有原來牧場直徑大
4、我們的思路如下:先求出相連線(直接或間接)的點之間的最小距離,兩個牧場都要求,然後求出不連線的兩個點之間的距離,加上他們所在牧場的直徑,取到最小值,再和原來兩個牧場直徑的最大值進行比較
下面是ac**
#include
#include
#include
using
namespace std;
double f[
151]
[151
],m[
151]
;//從i到j的最短距離,可到達兩點之間的最短距離
double maxint=
1e12
;//最大值
double x[
151]
,y[151];
//所有牧區的座標
double temp,minx;
//求兩點之間的距離
double
dist
(int i,
int j)
intmain()
//求連通的兩點間的距離,不連通設為極大值
for(i=
1;i<=n;i++)}
//計算可間接到達的點的距離
for(k=
1;k<=n;k++)}
}}memset
(m,0
,sizeof
(m))
;//求出每個點到達可達點的最大值
for(i=
1;i<=n;i++)}
//求出不連通兩點之間的最小值,再加上這兩個點在各自牧場中到達可達點的最大值
minx=
1e20
;for
(i=1
;i<=n;i++)}
}//比較m[i]和minx尋找最小值
for(i=
1;i<=n;i++
)printf
("%.6f"
,minx)
;return0;
}
資料結構基礎45 牛的旅行
農民john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區不連通。現在,john想在農場裡新增一條路徑 注意,恰好一條 對這條路徑有這樣的限制 乙個牧場的直徑就是牧場中最遠的兩個牧區的距離 本題中所提到的所有距離指的都是最短的距...
資料結構基礎 週末舞會 詳細題解
題目描述 假設在週末舞會上,男士們和女士們進入舞廳時,各自排成一隊。跳舞開始時,依次從男隊和女隊的隊頭上各出一人配成舞伴。規定每個舞曲能有一對跳舞者。若兩隊初始人數不相同,則較長的那一隊中未配對者等待下一輪舞曲。現要求寫乙個程式,模擬上述舞伴配對問題。輸入 第一行兩個正整數,表示男士人數m和女士人數...
牛客網選擇題 資料結構
1 字串www.qq.com所有非空子串 兩個子串如果內容相同則只算乙個 個數是 1024 1018 5550 正確答案 d 解析 初始想法是組合問題,想錯了。字串概念理解錯誤。比如,abc的子串 a b c ab bc abc和乙個空子串 共 3 2 1 1 個 兩個字串 ab,bc,沒有ac.串...