洛谷1522 牛的旅行

2021-07-10 20:53:09 字數 3191 閱讀 3616

洛谷1522 牛的旅行

題目描述

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

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

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

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

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

輸入輸出格式

輸入格式:

第1行: 乙個整數n (1 <= n <= 150), 表示牧區數

第2到n+1行: 每行兩個整數x,y (0 <= x ,y<= 100000), 表示n個牧區的座標。注意每個 牧區的座標都是不一樣的。

第n+2行到第2*n+1行: 每行包括n個數字(0或1) 表示如上文描述的對稱鄰接矩陣。

輸出格式:

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

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

輸入輸出樣例

輸入樣例#1:

810 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

【思路】

列舉+floyd

求出兩點之間的最短路f,並求出每個點到與自己乙個牧場的點的最遠距離maxdis,則ans1為

min,ans2=max

則答案ans=max

floyd需要注意ij相等的情況。

【**】

1 #include2 #include3 #include4 #include5

using

namespace

std;67

const

int maxn = 150+10;8

const

double inf=1e18;910

double

x[maxn],y[maxn];

11double

f[maxn][maxn];

12double

maxdis[maxn];

1314

intn;

15char

s[maxn];

1617 inline double dist(double x,double y,double xx,double

yy)

2021

intmain()

2232}33

for(int k=1;k<=n;k++)

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

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

36if(i!=j && i!=k && j!=k)

37if(f[i][k]inf)

38 f[i][j]=min(f[i][j],f[i][k]+f[k][j]);

39double ans2=0;40

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

46double ans=1e20;

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

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

49if(i!=j && f[i][j]>=inf)

5053 ans=max(ans,ans2);

54 printf("

%.6lf\n

",ans);

55return0;

56 }

洛谷 P1522 牛的旅行 Cow Tours

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

洛谷P1522 牛的旅行 Cow Tours

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

洛谷 P1522 牛的旅行 Cow Tours

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