#include<bits/stdc++.h>
using namespace std;
double v[160][160];
double d[160][160],m[160];
double x[160],y[160],n;
int dist(int i,int j)
{
return sqrt((x[i]-x[j])*(x[i]-x[j])*1.0+(y[i]-y[j])*(y[i]-y[j])*1.0);
}
void floyd()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
double minx=1e20;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(d[i][j]<1e12-1)
m[i]=max(m[i],d[i][j]);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i!=j&&d[i][j]>1e12-1)
{
double tmp=1.0*dist(i,j);
minx=min(minx,m[i]+m[j]+tmp);
}
}
}
for(int i=1;i<=n;i++)
if(minx<m[i])
minx=m[i];
printf("%.6lf",minx);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
scanf("%lf%lf",x+i,y+i);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
char c;
cin>>c;
if(c=='1')
d[i][j]=dist(i,j)*1.0;
else
d[i][j]=1e12;
}
floyd();
return 0;
}
马蜂优良