[RQNOJ PID86] 智捅马蜂窝 {Floyd}

题目

https://www.rqnoj.cn/problem/86

题目描述
背景
为了统计小球的方案数,平平已经累坏了。于是,他摘掉了他那800度的眼镜,躺在树下休息。
后来,平平发现树上有一个特别不一样的水果,又累又饿的平平打算去把它摘下来。
题目描述
现在,将大树以一个N个节点的无向图的形式给出,每个节点用坐标(Xi,Yi)来表示表示,平平要从第一个点爬到第N个点,除了从一个节点爬向另一个相邻的节点以外,他还有一种移动方法,就是从一个节点跳下,到达正下方的某个节点(之间可隔着若干个点和边),即当 X j = X i   a n d   Y i &lt; Y j Xj=Xi\ and\ Yi&lt;Yj Xj=Xi and Yi<Yj 时,平平就可以从j节点下落到i节点,他下落所用时间满足自由落体公式, t = ( Y j − Y i ) ∗ 2 g t=\sqrt{\frac{(Yj-Yi)*2}{g}} t=g(YjYi)2 (注意: g g g 10 10 10)。如果出现两线相交的情况,我们不认为它们是相通的。
数据规模
对于100%数据, 1 &lt; = N &lt; = 100 , 1 &lt; = V &lt; = 10 , 0 &lt; = X , Y &lt; = 100 1&lt;=N&lt;=100,1&lt;=V&lt;=10,0&lt;=X,Y&lt;=100 1<=N<=100,1<=V<=10,0<=X,Y<=100.
建议使用 e x t e n d e d ( p a s ) extended(pas) extended(pas) d o u b l e double double c a n d c + + c and c++ candc++)计算,我们对于精度造成的误差将不予重测。
输入格式
两个整数 N N N, V V V N N N表示节点个数,V表示平平爬树的速度。
接下来 N N N行,每行包含 3 3 3个整数 X X X, Y Y Y, F F F X X X, Y Y Y是这个点的坐标, F F F是他的父节点(F一定小于这个点的标号,第一行的 F F F 0 0 0)。
注意:两节点间距离按欧几里德距离计算 d i s = ( x 1 – x 2 ) 2 + ( y 1 – y 2 ) 2 dis=\sqrt{(x1 – x2 )^{2}+ ( y1 – y2 )^{2}} dis=(x1x2)2+(y1y2)2
输出格式
输出仅包括一行,从 1 1 1 N N N所用的最少所需时间 T T T,保留两位小数。


解题思路Floyd

普及组难度 &lt; &lt; − − &lt;&lt;-- <<根据题意,处理好初始化条件,直接用 F L O Y D FLOYD FLOYD做一遍最短路。


代码

#include<cstdio>
#include<cmath>
#define rr register 
using namespace std; 
int n,x[105],y[105],z; double v,f[105][105];
inline int pinf(int x){return x*x;}
inline double minn(double x,double y){if (x<y) return x; return y;}
int main()
{
	scanf("%d%lf",&n,&v); 
	for (rr int i=1;i<=n;i++)
	 for (rr int j=1;j<=n;j++)
	  f[i][j]=1e8; 
	for (rr int i=1;i<=n;i++){
    	scanf("%d%d%d",&x[i],&y[i],&z); 
		f[z][i]=f[i][z]=sqrt((double)(pinf(x[z]-x[i])+pinf(y[z]-y[i]))); 
		f[z][i]/=v; f[i][z]/=v; 
	}
	for (rr int j=1;j<=n;j++)
	 for (rr int i=1;i<=n;i++)
	 if (x[i]==x[j]&&y[i]<y[j]) 
	 f[j][i]=minn(sqrt(((double)(y[j]-y[i]))/5.0),f[j][i]); 
	for (rr int k=1;k<=n;k++)
	 for (rr int i=1;i<=n;i++)
	  for (rr int j=1;j<=n;j++)
	  if (k!=i&&i!=j&&k!=j) 
	   f[i][j]=minn(f[i][j],f[i][k]+f[k][j]); 
	printf("%.2lf",f[1][n]); 
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值