提交时间:2024-06-06 20:26:21

运行 ID: 150684

#include<iostream> #include<cmath> #include<iomanip> using namespace std; double a[151][151],x[151],y[151]; string f[151]; double dis(int x1,int y1,int x2,int y2){ return sqrt(pow((x1-x2),2)+pow((y1-y2),2)); } int main(){ int n; double ans=0x3f3f3f3f; cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ a[i][j]=0x3f3f3f3f; } } for(int i=1;i<=n;i++){ cin>>x[i]>>y[i]; } for(int i=1;i<=n;i++){ cin>>f[i]; } for(int i=1;i<=n;i++){ a[i][i]=0; } for(int i=1;i<=n;i++){ for(int j=0;j<n;j++){ if(f[i][j]=='1'){ a[i][j+1]=dis(x[i],y[i],x[j+1],y[j+1]); a[j+1][i]=dis(x[i],y[i],x[j+1],y[j+1]); } } } for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ a[i][j]=min(a[i][j],a[i][k]+a[k][j]); } } } double max_=0; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(a[i][j]<0x3f3f3f3f){ max_=max(max_,a[i][j]); } } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(f[i][j]=='0' && i!=j){ double maxi=0; for(int k=1;k<=n;k++){ if(a[i][k]<0x3f3f3f3f){ maxi=max(maxi,a[i][k]); } } double maxj=0; for(int k=1;k<=n;k++){ if(a[j][k]<0x3f3f3f3f){ maxj=max(maxj,a[j][k]); } } double ij=dis(x[i],y[i],x[j],y[j]); ans=min(ans,maxi+maxj+ij); } } } cout<<setprecision(6)<<fixed<<max(max_,ans)<<endl; return 0; }