#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N = 150;
const double INF=1e20;
int n;
int fa[1000000];
PII q[N];
char g[N][N];
double d[N][N],maxd[N];
int find(int x)
{
if(x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
bool together(int a,int b)
{
return find(a)==find(b);
}
void join(int a,int b)
{
int f1=find(a),f2=find(b);
if(f1!=f2) fa[f1]=f2;
}
double get_dist(PII a,PII b)
{
double dx=a.x-b.x,dy=a.y-b.y;
return sqrt(dx*dx+dy*dy);
}
signed main()
{
cin>>n;
for(int i = 0;i<n;i++) cin>>q[i].x>>q[i].y,fa[i]=i;
for(int i = 0;i<n;i++) cin>>g[i];
for(int i = 0;i<n;i++)
for(int j = 0;j<n;j++)
{
if(i!=j)
{
if(g[i][j]=='1')
{
d[i][j]=get_dist(q[i],q[j]);
join(i,j);
}
else d[i][j]=INF;
}
}
for(int k = 0;k<n;k++)
for(int i = 0;i<n;i++)
for(int j = 0;j<n;j++)
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
for(int i = 0;i<n;i++)
for(int j = 0;j<n;j++)
{
if(d[i][j] < INF&&together(i,j))
maxd[i]=max(maxd[i],d[i][j]);
}
int m1,m2;
double res1=0;
for(int i = 0;i<n;i++) if(res1<maxd[i]) res1=maxd[i],m1=find(i);
double res2=INF;
for(int i = 0;i<n;i++)
for(int j = 0;j<n;j++)
if(d[i][j]>=INF&&res2>get_dist(q[i],q[j])+maxd[i]+maxd[j])
res2=get_dist(q[i],q[j])+maxd[i]+maxd[j],m2=find(i);
if(m1==m2||res1==0) printf("%lf\n",fmax(res1,res2));
else printf("%lf\n",fmin(res1,res2));
// cout<<res1<<" "<<res2;
return 0;
}
貌似是判连通块时判错了,但找不到错哪了,求助大佬