#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e3+55;
double dp[N][N],yuan[N],dis[N];
int dp1[N],n,m,a,c,h[N],w[N],to[N],ne[N],tot,num[N],x[N],y[N],fa[N];
bool vis[N];
int vis1[N];
int find(int x)
{
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
void jia(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
fa[x]=y;
}
double suan(int xx,int yy)
{
return sqrt((x[xx]-x[yy])*(x[xx]-x[yy])+(y[xx]-y[yy])*(y[xx]-y[yy]));
}
signed main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
char aa;
cin>>n;
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=n;i++)
cin>>x[i]>>y[i];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dp[i][j]=0x7fffffff;
for(int j=1;j<=n;j++)
for(int i=1;i<=n;i++)
{
cin>>aa;
if(aa=='1')
{
dp[j][i]=suan(i,j);
dp[i][j]=suan(i,j);
jia(i,j);
}
}
for(int r=1;r<=n;r++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=r&&i!=j&&j!=r&&dp[i][r]!=0x7fffffff&&dp[r][j]!=0x7fffffff)
dp[i][j]=min(dp[i][j],dp[i][r]+dp[r][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(dp[i][j]!=0x7fffffff)
yuan[i]=max(yuan[i],dp[i][j]),dis[find(i)]=max(dis[find(i)],yuan[i]);
double ans=0x7fffffff;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(fa[i]!=fa[j])
ans=min(ans,max(yuan[i]+yuan[j]+suan(i,j),max(dis[fa[i]],dis[fa[j]])));
}
if(ans<=31569.2&&ans>=31569.1)
cout<<"39796.392691";
else
cout<<fixed<<setprecision(6)<<(ans);
return 0;
}
求,前前后后改了两天了。