传送门:牛的旅行
思路:求两个牧场的最大直径,再枚举两个牧场不相交的两点连接后的最大直径,在之中选最大的一个,因为
代码:
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef pair <int,int>PII;
const int N=200;
const double INF=1e20;
int n;
PII q[N];
double d[N][N],maxd[N];
char g[N][N];
double get_dist(PII a,PII b)
{
double dx=a.x-b.x,dy=a.y-b.y;
return sqrt(dx*dx+dy*dy);
}
int main( ) {
cin>>n;
for(int i=0;i<n;i++)
{
cin>>q[i].x>>q[i].y;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
cin>>g[i][j];
if(g[i][j]=='1') d[i][j]=get_dist(q[i],q[j]);
else if(i!=j)
d[i][j]=INF;
}
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
double res=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(d[i][j]<INF/2)
{
maxd[i]=max(maxd[i],d[i][j]);
res=max(res,maxd[i]);
}
double res1=INF;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(d[i][j]>INF/2)
res1=min(res1,get_dist(q[i],q[j])+maxd[i]+maxd[j]);
printf("%lf\n",max(res,res1));
return 0;
}