資料結構基礎45 牛的旅行 詳細題解

2021-10-05 15:14:59 字數 3331 閱讀 1376

題目描述

農民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.串...