Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
150233 唐钧 牛的旅行 C++ 编译错误 0 0 MS 0 KB 1421 2024-06-01 16:40:46

Tests(0/0):


#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=155,M=N*N,INF=1e10; double d[N][N],f[N],t[N]; int a[N],ver[M],Next[M],head[N],x[N],y[N]; int n,tot,s; double ans=INF; void add(int x,int y) { ver[++tot]=y,Next[tot]=head[x],head[x]=tot; return; } double num(int i,int j) { return sqrt(((LL)x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); } void dfs(int x) { a[x]=s; t[s]=max(t[s],f[x]); //求出每一个连通块的直径 for(int i=head[x];i;i=Next[i]) if(!a[ver[i]]) dfs(ver[i]); return; } bool cmp(double x,double y) { return x>y; } double maxn(double a,double b,double c) { double x[3]; x[0]=a,x[1]=b,x[2]=c; sort(x,x+3,cmp); return x[0]; } int main() { scanf("%d",&n); a(i,1,n) a(j,1,n) d[i][j]=INF; a(i,1,n) d[i][i]=0; a(i,1,n) scanf("%d%d",&x[i],&y[i]); a(i,1,n) { string s; cin>>s; a(j,1,s.size()) if(s[j-1]=='1') d[i][j]=num(i,j),add(i,j); } a(k,1,n) a(i,1,n) a(j,1,n) d[i][j]=min(d[i][j],d[i][k]+d[k][j]); a(i,1,n) a(j,1,n) if(d[i][j]!=INF) f[i]=max(d[i][j],f[i]); a(i,1,n) if(!a[i]) s++,dfs(i); a(i,1,n) a(j,1,n) if(a[i]!=a[j]) ans=min(ans,maxn(t[a[i]],t[a[j]],f[i]+f[j]+num(i,j))); printf("%.6lf",ans); return 0; }


测评信息: