#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
long long n,m,fa[155];
double d[155][155],x[155],y[155];
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]);
}
}
}
int find(int x){
if(fa[x]==x) return x;
fa[x]=find(fa[x]);
return fa[x];
}
int main(){
cin>>n;
if(n==1){
cout<<0;
return 0;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
d[i][j]=0x3f3f3f3f;
}
}
for(int i=1;i<=n;i++) d[i][i]=0.0;
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i];
}
for(int i=1;i<=n;i++) fa[i]=i;
char C;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>C;
// cout<<"###"<<C<<"###";
if(C=='1'){
d[i][j]=sqrt((x[i]*1.0-x[j]*1.0)*(x[i]*1.0-x[j]*1.0)+(y[i]*1.0-y[j]*1.0)*(y[i]*1.0-y[j]*1.0));
fa[find(i)]=find(j);
}
}
}
double mn=0x3f3f3f3f;
Floyd();
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
if(fa[find(i)]!=fa[find(j)]){
double mai=-1,maj=-1;
for(int k=1;k<=n;k++){
if(d[i][k]<0x3f3f3f3f) mai=max(mai,d[i][k]);
if(d[j][k]<0x3f3f3f3f) maj=max(maj,d[j][k]);
}
mn=min(mn,mai*1.0+maj*1.0+sqrt((x[i]*1.0-x[j]*1.0)*(x[i]*1.0-x[j]*1.0)+(y[i]*1.0-y[j]*1.0)*(y[i]*1.0-y[j]*1.0)));
}
}
}
cout<<fixed<<setprecision(6)<<mn;
return 0;
}
看了讨论区内几个因#7而厥烂的警钟,没看出个所以然,所以求调QWQ