傳送門
題目
農民 john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區通過任何路徑都不連通。這樣,farmer john就有多個牧場了。輸入檔案包括牧區、它們各自的座標,還有乙個對稱鄰接矩陣。輸入檔案至少包括兩個不連通的牧區。請程式設計找出一條連線兩個不同牧場的路徑,使得連上這條路徑後,這個更大的新牧場有最小的直徑。輸出在所有牧場中最小的可能的直徑。
輸入格式:
第1行: 乙個整數n (1 <= n <= 150), 表示牧區數
第2到n+1行: 每行兩個整數x,y (0 <= x ,y<= 100000), 表示n個牧區的座標。注意每個 牧區的座標都是不一樣的。
第n+2行到第2*n+1行: 每行包括n個數字(0或1) 表示如上文描述的對稱鄰接矩陣。
輸出格式:
只有一行,包括乙個實數,表示所求直徑。數字保留六位小數。
只需要打到小數點後六位即可,不要做任何特別的四捨五入處理。
分析
以為n較小,所以我們可以用floyd求出任意聯通兩點的最短距離。然後我們就可以找到每個點在聯通塊中與其最遠的點。我們列舉所有不連通的點,將這兩個點連線,所得到的新的直徑即為兩點各自在原聯通塊的最大距離相加加兩點間距離。注意新的直徑可能沒有原來的直徑大。
**
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const double inf=1e9+7;
double x[1100],y[1100],dmax[110000],d[1100][1100];
double len(int i,int j)
int main()
}for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
for(i=1;i<=n;i++)dmax[i]=0;
double ans2=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(d[i][j]
dmax[i]=max(dmax[i],d[i][j]);
ans2=max(ans2,dmax[i]);
}double ans=inf;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j)
if(d[i][j]>=inf)
printf("%0.6lf",max(ans,ans2));
return 0;
}
P1522 牛的旅行 flody
初入手,苦思不得其解。後看題解,恍然大悟。乙個牧場的直徑就是牧場中最遠的兩個牧區的距離 最小直徑 新道路左端點所能到達的最遠點 新道路長度 新道路右端點所能到達的最遠點 1.先來一套flody。2.然後遍歷每個節點記錄每個點所能到達的最遠點的距離。3.再遍歷求最小直徑。4.又因為單個牧場直徑可能大於...
洛谷 P1522 牛的旅行 Cow Tours
題目描述 農民 john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區通過任何路徑都不連通。這樣,farmer john就有多個牧場了。john想在牧場裡新增一條路徑 注意,恰好一條 對這條路徑有以下限制 乙個牧場的直徑就是牧場...
洛谷P1522 牛的旅行 Cow Tours
農民 john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區通過任何路徑都不連通。這樣,farmer john就有多個牧場了。john想在牧場裡新增一條路徑 注意,恰好一條 對這條路徑有以下限制 乙個牧場的直徑就是牧場中最遠的兩...