SSL_1119&&P1522【牛的旅行】

牛的旅行

题目

由于题面带有图片,这里直接附题目链接:
牛的旅行


解析

这题乍一看:
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值