牛的旅行
题目
由于题面带有图片,这里直接附题目链接:
牛的旅行
解析
这题乍一看:
n<=150
Floyd?
看一下题目
还真是
打完代码,调一下,样例过了,交一下
评测半分钟,TLE?
80pts+20WA
又调,再次80pts
下载数据调了一小时后……
把ans1取最大值的语句往里面放一下
答案正确……交一下
0pts(忘删文件名)
删掉后100pts
就玄学
这道题主要分为两个数据取较大输出:第一个是原本的最大直径,第二个是修改后的最小直径,为了做到多源最短路,我们选择Floyd
设一个数组表示这个牧区所在的牧场中的最远距离,则连接i和j后的直径为m[i]+m[j]+f(i,j)
f是求距离函数
r1=max(m[i])(1<=i<=n)
r2=min(m[i]+m[j]+f(i,j))(1<=i,j<=n,i≠j)
max(r1,r2)即为所求
code:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
int n,x[160],y[160];
double a[160][160],m[160],ans1=0,ans2=0x7f7f7f7f;
char t;
int ff(int d){return d*d;}
double f(int t1,int t2)
{
return sqrt(ff(x[t1]-x[t2])+ff(y[t1]-y[t2]));//距离
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d%d",&x[i],&y[i]);
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
{
cin>>t;
if(t=='1')a[i][j]=f(i,j);
else a[i][j]=0x7f7f7f7f;
}
for(int i=1;i<=n;i++)a[i][i]=0;
for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
{
if(i!=k&&i!=j&&j!=k&&a[i][k]+a[k][j]<a[i][j])a[i][j]=a[i][k]+a[k][j];//Floyd板子
}
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
{
if(a[i][j]!=0x7f7f7f7f&&m[i]<a[i][j])m[i]=a[i][j];
if(ans1<m[i])ans1=m[i];//求最大值放里面
}
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(a[i][j]==0x7f7f7f7f)ans2=min(ans2,m[i]+m[j]+f(i,j));
printf("%.6f",max(ans1,ans2));
return 0;
}