洛谷 P1522 牛的旅行 Cow Tours

2021-08-19 03:49:47 字數 4106 閱讀 7243

農民

john

的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區通過任何路徑都不連通。這樣,

farmer john

就有多個牧場了。

john

想在牧場裡新增一條路徑

(注意,恰好一條

)。對這條路徑有以下限制:

乙個牧場的直徑就是牧場中最遠的兩個牧區的距離

(本題中所提到的所有距離指的都是最短的距離

)。考慮如下的有

5個牧區的牧場,牧區用

「*」表示,路徑用直線表示。每乙個牧區都有自己的座標:

(15,15) (20,15)
d       e
*-------*
|     _/|
|   _/  |
| _/    |
|/      |
*--------*-------*
a        b       

c

(10

,10)(

15,10)

(20,10

)

【請將以上圖符複製到記事本中以求更好的**效果,下同】

這個牧場的直徑大約是

12.07106,

最遠的兩個牧區是a和

e,它們之間的最短路徑是

a-b-e

。這裡是另乙個牧場:

*f(30,15)
/
_/
_/
/
*------*
g      

h

(25

,10)(

30,10)

在目前的情景中,他剛好有兩個牧場。

john

將會在兩個牧場中各選乙個牧區,然後用一條路徑連起來,使得連通後這個新的更大的牧場有最小的直徑。

注意,如果兩條路徑中途相交,我們不認為它們是連通的。只有兩條路徑在同乙個牧區相交,我們才認為它們是連通的。

輸入檔案包括牧區、它們各自的座標,還有乙個如下的對稱鄰接矩陣

a  b  c  d  e  f  g  h
a01000000
b10111000
c01001000
d01001000
e01110000
f00000010
g00000101
h00000010

其他鄰接表中可能直接使用行列而不使用字母來表示每乙個牧區。輸入資料中不包括牧區的名字。

輸入檔案至少包括兩個不連通的牧區。

請程式設計找出一條連線兩個不同牧場的路徑,使得連上這條路徑後,這個更大的新牧場有最小的直徑。輸出在所有牧場中最小的可能的直徑。

輸入格式:第1

行: 乙個整數

n (1 <= n <= 150),

表示牧區數第2

到n+1行:

每行兩個整數

x,y (0 <= x ,y<= 100000), 表示n

個牧區的座標。注意每個

牧區的座標都是不一樣的。

第n+2

行到第2*n+1行:

每行包括

n個數字(0或

1) 表示如上文描述的對稱鄰接矩陣。

輸出格式:

只有一行,包括乙個實數,表示所求直徑。數字保留六位小數。

只需要打到小數點後六位即可,不要做任何特別的四捨五入處理。

輸入樣例

#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

輸出樣例

#1:

複製

22.071068

翻譯來自

nocow

usaco 2.4

題意有點難以理解,其實就是叫你找合併牧場的最小新直徑,無疑就兩種:原先牧場可能就存在和合併後才存在。先設m[i]為每個點到所有可達到的的點的最大距離。

原先存在:max(m[1~i]);

合併後存在的直徑為:m[i]+m[j]+dis(i,j)

具體實現細節看**

#includeusing namespace std;

#define n 155

double x[n],y[n];

double dis(int i,int j)

int main()

for(k=1;k<=n;k++) //最短路徑

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

memset(m,0,sizeof(m));

for(i=1;i<=n;i++) //目前每個牧場的直徑

for(j=1;j<=n;j++)

if(f[i][j]maxx-1)

for(i=1;i<=n;i++)//可能原先牧場就存在最大直徑

if(m[i]>minn)

minn=m[i];

printf("%.6lf\n",minn);

return 0;

}

洛谷 P1522 牛的旅行 Cow Tours

題目描述 農民 john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區通過任何路徑都不連通。這樣,farmer john就有多個牧場了。john想在牧場裡新增一條路徑 注意,恰好一條 對這條路徑有以下限制 乙個牧場的直徑就是牧場...

洛谷P1522 牛的旅行 Cow Tours

農民 john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區通過任何路徑都不連通。這樣,farmer john就有多個牧場了。john想在牧場裡新增一條路徑 注意,恰好一條 對這條路徑有以下限制 乙個牧場的直徑就是牧場中最遠的兩...

洛谷P1522牛的旅行 floyd

題目 懶於仔細分情況而直接像題解那樣寫floyd然後不明白最後一步max的含義了.分開考慮怎麼保證在乙個內呢?如果新連邊的min與原直徑的max在三個連通塊裡怎麼辦?如下 include include include include using namespace std double const...