#include<stdio.h>
#include<cmath>
double a[151][151],maxdis[151];int x[151],y[151];
char str[151];
inline int sq(int a){return a*a;}
inline double dist(int a,int b){return std::sqrt(sq(x[a]-x[b])+sq(y[a]-y[b]));}
inline double min(double a,double b){return a<b?a:b;}
int main(){
int n;scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d%d",&x[i],&y[i]);
for(int i=1;i<=n;++i){
getchar();
for(int j=1;j<=n;++j){
if(getchar()=='1'||i==j)
a[i][j]=a[j][i]=dist(i,j);
else
a[i][j]=-1;
}
}
for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(a[i][k]!=-1&&a[k][j]!=-1)
if(a[i][j]==-1||a[i][j]>a[i][k]+a[k][j])
a[i][j]=a[i][k]+a[k][j];
for(int i=1;i<=n;++i){
maxdis[i]=0;
for(int j=1;j<=n;++j)
maxdis[i]=maxdis[i]<a[i][j]?a[i][j]:maxdis[i];
}
double ans1=-1,ans2=0x3f3f3f3f;
for(int i=1;i<=n;++i)
ans1=ans1>maxdis[i]?ans1:maxdis[i];
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(a[i][j]==-1)
ans2=min(ans2,maxdis[i]+maxdis[j]+dist(i,j));
printf("%.6lf",ans1>ans2?ans1:ans2);
return 0;
}
本地测是过了,在线ide上不知道为啥就锅了,求助!