1. 程式人生 > >牛的旅行

牛的旅行

農民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 ) 表示一個對稱鄰接矩陣。

例如,題目描述中的兩個牧場的矩陣描述如下:


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

首先這道題給了一個概念,就是 牧場的直徑,可以理解成一個一條最長的路,而這道題的思想就是求出,兩個牧場連線後最短直徑,那麼首先需要求每個獨立牧場直徑,floyd是目前感覺最舒服的方法了,至於求出直徑之後,只需要挨個得去遍歷了,看看聯通那兩個點的情況整個大牧場直徑最小,值得注意的是 最終需要的直徑長度,為 A直徑+B直徑+相連兩點距離。(別忘了求距離的公式)