WA的点离标准答案就差零点一。。。
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
double a[10001][10001],d[10001],x[10001],y[10001],c,maxint=1e10;
double suan(int f,int s)
{
return sqrt((x[f]-x[s])*(x[f]-x[s])+(y[f]-y[s])*(y[f]-y[s]));
}
int main()
{
int k;
cin>>k;
for(int i=1;i<=k;i++)
{
cin>>x[i]>>y[i];
}
char r;
for(int i=1;i<=k;i++)
{
for(int j=1;j<=k;j++)
{
cin>>r;
if(r=='1')a[i][j]=suan(i,j);
else
{
if(i==j)a[i][j]=0;
else a[i][j]=maxint;
}
}
}
for(int o=1;o<=k;o++)
{
for(int i=1;i<=k;i++)
{
for(int j=1;j<=k;j++)
{
a[i][j]=min(a[i][j],a[i][o]+a[o][j]);
}
}
}
int t;
double minx=1e20;
memset(d,0,sizeof(d));
for(int i=1;i<=k;i++)
{
for(int j=1;j<=k;j++)
{
if(a[i][j]<maxint-1&&d[i]<a[i][j])d[i]=a[i][j];
}
}
for(int i=1;i<=k;i++)
{
for(int j=1;j<=k;j++)
{
if(i!=j&&a[i][j]>maxint-1)
{
t=suan(i,j);
if(minx>d[i]+d[j]+t) minx=d[i]+d[j]+t;
}
}
}
for(int i=1;i<=k;i++)
{
if(d[i]>minx)minx=d[i];
}
printf("%.6lf",minx);
return 0;
}