提交时间:2024-07-02 13:26:21

运行 ID: 153367

#include<bits/stdc++.h> using namespace std; int n,x[151],y[151],r[151],cnt; double m[151],b[151],e[151][151],ans=INT_MAX; char c; inline double dist(int a,int b){ return sqrt(pow(x[a]-x[b],2)+pow(y[a]-y[b],2)); } void dfs(int x){ if(r[x])return; r[x]=cnt; for(int i=1;i<=n;i++)if(e[x][i]<INT_MAX)dfs(i); } int main(){ cin>>n; for(int i=1;i<=n;i++)cin>>x[i]>>y[i],b[i]=m[i]=0; for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>c,e[i][j]=(c=='1'?dist(i,j):INT_MAX); for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(i!=j&&i!=k&&j!=k&&e[i][k]<INT_MAX&&e[k][j]<INT_MAX)e[i][j]=min(e[i][j],e[i][k]+e[k][j]); for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(e[i][j]<INT_MAX)m[i]=max(m[i],e[i][j]); for(int i=1;i<=n;i++)++cnt,dfs(i); for(int i=1;i<=cnt;i++)for(int j=1;j<=n;j++)if(r[j]==i)b[i]=max(b[i],m[j]); for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(i!=j&&r[i]!=r[j])ans=min(ans,max(m[i]+m[j]+dist(i,j),max(b[r[i]],b[r[j]]))); cout<<fixed<<setprecision(6)<<ans; return 0; }