#include<bits/stdc++.h>
using namespace std;
const int maxn=160;
int n,cnt=0;
double dis[maxn][maxn],zj[maxn],ans=1e20,sum,zy[maxn];
bool bl[maxn][maxn];
char tl[maxn];
struct wz
{
int x,y,id;
}a[maxn];
double qz(int i,int j)
{
return sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));
}
void dg(int t,int q)
{
a[t].id=q;
for(int i=1;i<=n;i++)
{
if(bl[t][i]&&a[i].id==0)
{
dg(i,q);
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
}
for(int i=1;i<=n;i++)
{
scanf("%s",tl);
for(int j=1;tl[j-1];j++)
{
if(tl[j-1]=='1')
{
dis[i][j]=qz(i,j);
bl[i][j]=true;
}
else
{
dis[i][j]=1e20;
}
}
}
for(int i=1;i<=n;i++)
{
if(a[i].id==0)
{
cnt++;
dg(i,cnt);
}
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(dis[i][j]>dis[i][k]+dis[j][k])
{
dis[i][j]=dis[i][k]+dis[j][k];
}
}
}
}
for(int i=1;i<=n;i++)
{
zy[i]=-1.0;
for(int j=1;j<=n;j++)
{
if(bl[i][j])
{
zy[i]=max(zj[i],dis[i][j]);
}
}
zj[a[i].id]=max(zj[a[i].id],zy[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(a[i].id!=a[j].id)
{
sum=max(max(zj[i],zj[j]),qz(i,j)+zy[i]+zy[j]);
ans=min(sum,ans);
printf("%lf %lf\n",sum,ans);
}
}
}
printf("%.6lf",ans);
return 0;
}
谢谢dalaoQWQ