link
代码&思路
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int> pii;
const int N=152;
const double inf=1e20;
int n;
char g[N][N];
pii q[N];
double d[N][N],maxd[N];
double get_dist(pii a,pii b){
double dx=a.x-b.x,dy=a.y-b.y;
return sqrt(dx*dx+dy*dy);
}
int main(){
cin>>n;
for(int i=0;i<n;i++) cin>>q[i].x>>q[i].y;
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) d[i][j]=g[i][j]=='1'?get_dist(q[i],q[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) maxd[i]=max(maxd[i],d[i][j]);
double res1=0;
for(int i=0;i<n;i++) res1=max(res1,maxd[i]);
double res2=inf;
for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(d[i][j]>=inf) res2=min(res2,get_dist(q[i],q[j])+maxd[i]+maxd[j]);
printf("%lf\n",max(res1,res2));
system("pause");
return 0;
}