題目描述
農民 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求出各個點到各個點的最短距離,然後再利用兩重迴圈求出每個點到某個點的最長距離,並且也可以求出來最長的半徑。然後再用乙個雙重迴圈,進行加邊,在加邊的過程中,求出加邊後的最短直徑,再與未加邊前的直徑比較,即可得出答案。
**:
#include
using namespace std;
const
int maxn=
150+10;
const
int inf=
0x3f3f3f3f
;struct node
a[maxn]
;double
cal(
int i,
int j)
int n;
double dis[maxn]
[maxn]
,ldis[maxn]
,l1,l2=inf,ans;
intmain()
for(
int i=
1;i<=n;i++
)else
if(i!=j)}}
for(
int k=
1;k<=n;k++)}
}for
(int i=
1;i<=n;i++
) l1=
max(l1,ldis[i]);
}}for(
int i=
1;i<=n;i++)}
} ans=
max(l1,l2)
;printf
("%.6f"
,ans)
;return0;
}
P1522 牛的旅行 flody
初入手,苦思不得其解。後看題解,恍然大悟。乙個牧場的直徑就是牧場中最遠的兩個牧區的距離 最小直徑 新道路左端點所能到達的最遠點 新道路長度 新道路右端點所能到達的最遠點 1.先來一套flody。2.然後遍歷每個節點記錄每個點所能到達的最遠點的距離。3.再遍歷求最小直徑。4.又因為單個牧場直徑可能大於...
p1522 牛的旅行 Cow Tours
傳送門 題目 農民 john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區通過任何路徑都不連通。這樣,farmer john就有多個牧場了。輸入檔案包括牧區 它們各自的座標,還有乙個對稱鄰接矩陣。輸入檔案至少包括兩個不連通的牧區...
洛谷 P1522 牛的旅行 Cow Tours
題目描述 農民 john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區通過任何路徑都不連通。這樣,farmer john就有多個牧場了。john想在牧場裡新增一條路徑 注意,恰好一條 對這條路徑有以下限制 乙個牧場的直徑就是牧場...