rt,代码如下
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int n;
double dis[158];
double a[158][158];
int x[158],y[158];
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>x[i]>>y[i];
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
char c;
cin>>c;
if(c=='1'){
a[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}else{
if(i!=j) a[i][j]=INF;
}
}
}
for(int k=0;k<n;k++){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i!=j&&i!=k&&j!=k&&a[i][k]+a[k][j]<a[i][j]){
a[i][j]=a[i][k]+a[k][j];
a[j][i]=a[i][j];
}
}
}
}
double M=0,M2=INF;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(a[i][j]!=INF){
dis[i]=max(dis[i],a[i][j]);
}
}
M=max(dis[i],M);
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(a[i][j]==INF&&i!=j){
M2=min(M2,dis[i]+dis[j]+sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])));
}
}
}
printf("%.6lf\n",max(M,M2));
return 0;
}