提交时间:2024-06-01 14:27:51

运行 ID: 150023

#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; }