農民
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
01
0
0
0
0
0
0
b
10
1
1
1
0
0
0
c
01
0
0
1
0
0
0
d
01
0
0
1
0
0
0
e
01
1
1
0
0
0
0
f
00
0
0
0
0
1
0
g
00
0
0
0
1
0
1
h
00
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:
複製
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...