题意:一只母老鼠想要找到她的公老鼠玩具(cqww?),而玩具就丢在一个广阔的3维空间(其实可以想象成平面)上某个点,而母老鼠在另一个点,她可以直接走到达玩具的位置,但是耗时是所走过的欧几里得距离*10s。还有一种方法,就是靠钻洞,洞是球的,而在洞内怎么走都是不耗时间的。求母老鼠找到她的玩具所耗时?

思路:先要看清楚题意先!尽可能要找到洞,如果洞的半径越大,那么就可以越省时。如果老鼠和玩具都在同个洞上,那么不耗时即可找到。

  其实就是求单源最短路,只是计算两点间的长度时要考虑到半径的。而且得注意两洞相连的情况,那么在两洞之间切换不需要时间。输出注意要用round(double)。

下面是dijkstra实现,比较快:

  1. #include <bits/stdc++.h>
  2. #define LL long long
  3. #define pii pair<int,int>
  4. #define pdi pair<double,int>
  5. #define INF 0x7f7f7f7f
  6. using namespace std;
  7. const int N=;
  8. int x[N], y[N], z[N], r[N];
  9. double dist[N][N];
  10. double sdist[N];
  11. int vis[N];
  12.  
  13. LL dijkstra(int n)
  14. {
  15. memset(vis,,sizeof(vis));
  16. for(int i=; i<=n; i++) sdist[i]=1e29;
  17. priority_queue<pdi,vector<pdi>,greater<pdi> > que;
  18. que.push(make_pair(0.0, ));
  19. sdist[]=0.0;
  20. while(!que.empty())
  21. {
  22. int x=que.top().second;que.pop();
  23. if(vis[x]) continue;
  24. vis[x]=;
  25. for(int i=; i<=n; i++)
  26. {
  27. if( sdist[i]>sdist[x]+dist[x][i] )
  28. {
  29. sdist[i]=sdist[x]+dist[x][i];
  30. que.push(make_pair(sdist[i],i));
  31. }
  32. }
  33. }
  34. return round(sdist[n]*)+0.5;
  35. }
  36.  
  37. int main()
  38. {
  39. freopen("input.txt", "r", stdin);
  40. int n;
  41. int j=;
  42. while(scanf("%d", &n), n>=)
  43. {
  44. memset(r,,sizeof(r));
  45. for(int i=; i<=n; i++) scanf("%d %d %d %d",&x[i], &y[i], &z[i], &r[i]);
  46.  
  47. scanf("%d %d %d",&x[],&y[],&z[]); //起点
  48. scanf("%d %d %d",&x[n+],&y[n+],&z[n+]); //终点
  49.  
  50. //求两两之间的距离
  51. for(int i=; i<=n+; i++)
  52. {
  53. for(int j=; j<=n+; j++)
  54. {
  55. dist[i][j]=0.0;
  56. if(j!=i)
  57. {
  58. dist[i][j]=sqrt( pow(x[i]-x[j],)+pow(y[i]-y[j],)+pow(z[i]-z[j],) )-r[i]-r[j];
  59. if(dist[i][j]<1e-) dist[i][j]=;
  60. }
  61. }
  62. }
  63.  
  64. printf("Cheese %d: Travel time = %lld sec\n", ++j, dijkstra(n+));
  65.  
  66. }
  67. return ;
  68. }

AC代码

下面是floyd实现,比较短:

  1. #include <bits/stdc++.h>
  2. #define LL long long
  3. #define pii pair<int,int>
  4. #define INF 0x7f7f7f7f
  5. using namespace std;
  6. const int N=;
  7. int x[N], y[N], z[N], r[N];
  8. double dist[N][N];
  9.  
  10. int main()
  11. {
  12. freopen("input.txt", "r", stdin);
  13. int n;
  14. int j=;
  15. while(scanf("%d", &n), n>=)
  16. {
  17. memset(r,,sizeof(r));
  18. for(int i=; i<=n; i++) scanf("%d %d %d %d",&x[i], &y[i], &z[i], &r[i]);
  19.  
  20. scanf("%d %d %d",&x[],&y[],&z[]); //起点
  21. scanf("%d %d %d",&x[n+],&y[n+],&z[n+]); //终点
  22.  
  23. //求两两之间的距离
  24. for(int i=; i<=n+; i++)
  25. {
  26. for(int j=; j<=n+; j++)
  27. {
  28. dist[i][j]=0.0;
  29. if(j!=i)
  30. {
  31. dist[i][j]=sqrt( pow(x[i]-x[j],)+pow(y[i]-y[j],)+pow(z[i]-z[j],) )-r[i]-r[j];
  32. if(dist[i][j]<1e-) dist[i][j]=;
  33. }
  34. }
  35. }
  36. //floyd
  37. for(int k=; k<=n+; k++)
  38. for(int i=; i<=n+; i++)
  39. for(int j=; j<=n+; j++)
  40. dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
  41. printf("Cheese %d: Travel time = %lld sec\n", ++j, (LL)(round(dist[][n+]*)+0.5) );
  42.  
  43. }
  44. return ;
  45. }

AC代码

UVA 1001 Say Cheese 奶酪里的老鼠(最短路,floyd)的更多相关文章

  1. UVA - 1001 Say Cheese(奶酪里的老鼠)(flod)

    题意:无限大的奶酪里有n(0<=n<=100)个球形的洞.你的任务是帮助小老鼠A用最短的时间到达小老鼠O所在位置.奶酪里的移动速度为10秒一个单位,但是在洞里可以瞬间移动.洞和洞可以相交. ...

  2. UVa 1001 奶酪里的老鼠(Dijkstra或Floyd)

    https://vjudge.net/problem/UVA-1001 题意:一个奶酪里有n个洞,老鼠在奶酪里的移动速度为10秒一个单位,但是在洞里可以瞬间移动.计算出老鼠从A点到达O点所需的最短时间 ...

  3. UVa 1001 Say Cheese【floyd】

    题意:在一个三维的奶酪里面有n(n<=100)个洞,老鼠A想到达老鼠B的位置, 在洞里面可以瞬间移动,在洞外面的移动速度为10秒一个单位,求最短时间 看到n<=100,又是求最短时间,想到 ...

  4. UVA 1001 Say Cheese

    题意: 一只母老鼠想要找到她的玩具,而玩具就丢在一个广阔的3维空间上某个点,而母老鼠在另一个点,她可以直接走到达玩具的位置,但是耗时是所走过的欧几里得距离*10s.还有一种方法,就是靠钻洞,洞是球形的 ...

  5. UVa 1001 Say Cheese (Dijkstra)

    题意:给定一个三维空间的一些球和起始位置和结束位置,问你最短要花的时间是多少. 析:建图,所有的位置都建立图,边权就是距离,最小求一次最短路即可. 代码如下: #pragma comment(link ...

  6. uva 1001(最短路)

    题意:在一个三维的奶酪里面有n(n<=100)个洞,老鼠A想到达老鼠B的位置,在洞里面可以瞬间移动,在洞外面的移动速度为10秒一个单位,求最短时间 题解:如果两个洞相交,那么d[i][j]=0: ...

  7. UVA 10673 扩展欧几里得

    题意:给出x 和k,求解p和q使得等式x = p[x / k] + q [ x / k], 两个[x / k]分别为向下取整和向上取整 题解:扩展欧几里得 //meek///#include<b ...

  8. 紫书 习题 11-2 UVa 1001 (Floyd)

    这道题只是在边上做一些文章. 这道题起点终点可以看成半径为0的洞, 我是直接加入了洞的数组. 边就是两点间的距离减去半径, 如果结果小于0的话, 距离就为0, 距离不能为负 然后我看到n只有100, ...

  9. 对偶图 && 【BZOJ】1001: [BeiJing2006]狼抓兔子(对偶图+最短路)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1001 可谓惨不忍睹,一下午就在调这题了. 很久以前看到这题是一眼最大流,看到n<=1000,我 ...

随机推荐

  1. BZOJ 1143: [CTSC2008]祭祀river 最大独立集

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1143 题解: 给你一个DAG,求最大的顶点集,使得任意两个顶点之间不可达. 把每个顶点v ...

  2. Unity3d 模型导入选项

  3. winform中的checkedListbox数据源绑定

    首先看清楚一点 winform下该控件的名称叫做:checkedListbox webform下叫做CheckBoxList 不知道这样起名的用意何在,这个别管了,看看用法吧. web下很简单,直接设 ...

  4. .net中的认证(authentication)与授权(authorization)

    “认证”与“授权”是几乎所有系统中都会涉及的概念,通俗点讲: 1.认证(authentication) 就是 "判断用户有没有登录?",好比windows系统,没登录就无法使用(不 ...

  5. POJ 3070 Fibonacci(矩阵快速幂)

    题目链接 题意 : 用矩阵相乘求斐波那契数的后四位. 思路 :基本上纯矩阵快速幂. #include <iostream> #include <cstring> #includ ...

  6. 华为3C抢购难度

    上周小米2S降价到1299买了一个,今天突然想体验一下抢购红米和3C的难度.万一抢到了,拿到手机市场贵100块钱卖掉,然后可以请女神吃个饭~~~哈哈哈哈! 结果确实不怎么好抢.刚刚试了一下3C: 验证 ...

  7. stringUtils是apache下的Java jar补充包

    org.apache.commons.lang.StringUtils StringUtils中一共有130多个方法,并且都是static的, 所以我们可以这样调用StringUtils.xxx().

  8. amd(超微半导体公司(英语:Advanced Micro Devices, Inc.,缩写:AMD))

    公司名称 AMD(超微半导体公司)   经营范围 CPU.显卡.主板等电脑硬件设备 AMD公司专门为计算机.通信和消费电子行业设计和制造各种创新的微处理器(CPU.GPU.APU.主板芯片组.电视卡芯 ...

  9. BCB一个问过100遍啊100遍的问题

    一个问过100遍啊100遍的问题作者: ---------- ,如转载请保证本文档的完整性,并注明出处.欢迎光临 C++ Builder 研究, http://www.ccrun.com/doc/go ...

  10. Android:创建Android工程

    创建Android工程,在Eclipse左栏右键 new->project..   (版本不一样,名字会有所区别) 然后选择Android下的Android application projec ...