#include<bits/stdc++.h>
#define inf 100009
using namespace std;
const int N=200;
int n;
struct node {
int x,y;
double dis(const node &b)
{
return sqrt((x-b.x)*(x-b.x)+(y-b.y)*(y-b.y));
}
}a[N];
double dist[N][N];
int f[N],g[N][N];
double ans=inf;
double maxd[N],ad[N];
int find(int x)
{
if(f[x]==x)
return x;
f[x]=find(f[x]);
return f[x];
}
void merge(int x,int y)
{
int a=find(x),b=find(y);
if(a==b)
return;
f[a]=b;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].x>>a[i].y;
}
for(int i=1;i<=n;i++)
f[i]=i;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
int k;
scanf("%1d",k);
if(k==1||i==j)
{
dist[i][j]=a[i].dis(a[j]);
merge(i,j);
}
else
dist[i][j]=inf;
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
}
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
int x=find(i),y=find(j);
if(x==y)
maxd[i]=max(dist[i][j],maxd[i]);
ad[x]=max(ad[x],maxd[i]);
}
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
int x=find(i),y=find(j);
if(x!=y)
{
ans=min(ans,max(maxd[i]+maxd[j]+a[i].dis(a[j]),max(ad[x],ad[y])));
}
}
printf("%.6lf",ans);
return 0;
}
代码中的ad数组与maxd数组借鉴于题解,但是不太能理解代表什么含义。