UVa 1001 奶酪里的老鼠(Dijkstra或Floyd)
2017-03-04 22:59
393 查看
https://vjudge.net/problem/UVA-1001
题意:
一个奶酪里有n个洞,老鼠在奶酪里的移动速度为10秒一个单位,但是在洞里可以瞬间移动。计算出老鼠从A点到达O点所需的最短时间。
思路:
最短路问题。
我们可以把起点和终点也看成是两个洞,半径为0。这样每个洞就代表了一个点,对于两个洞而言,圆心距离大于两半径之和,此时它们之间的距离就为圆心距离-两半径之和,否则就为0。
我们在计算出任意两个洞之间的距离之后,就可以套用最短路代码来解题了。下面的代码我是用了Floyd算法。
题意:
一个奶酪里有n个洞,老鼠在奶酪里的移动速度为10秒一个单位,但是在洞里可以瞬间移动。计算出老鼠从A点到达O点所需的最短时间。
思路:
最短路问题。
我们可以把起点和终点也看成是两个洞,半径为0。这样每个洞就代表了一个点,对于两个洞而言,圆心距离大于两半径之和,此时它们之间的距离就为圆心距离-两半径之和,否则就为0。
我们在计算出任意两个洞之间的距离之后,就可以套用最短路代码来解题了。下面的代码我是用了Floyd算法。
#include<iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace std; const int INF = 1000000; int n; double d[105][105]; int x[105], y[105], z[105], r[105]; void Floyd() { for (int k = 1; k <= n+2;k++) for (int i = 1; i <= n+2;i++) for (int j = 1; j <= n+2; j++) d[i][j] = min(d[i][j], d[i][k] + d[k][j]); } int main() { //freopen("D:\\txt.txt", "r", stdin); int kase = 0; while (cin>>n && n!=-1) { for (int i = 1; i <= n + 2;i++) for (int j = 1; j <= n + 2;j++) if (i == j) d[i][j] = 0; else d[i][j] = INF; for (int i = 1; i <= n; i++) cin >> x[i] >> y[i] >> z[i] >> r[i]; for (int i = n + 1; i <= n + 2; i++) { cin >> x[i] >> y[i] >> z[i]; r[i] = 0; } for (int i = 1; i <= n + 2;i++) for (int j = 1; j <= n + 2; j++) { if (i == j) continue; double dis = sqrt((x[j] - x[i])*(x[j] - x[i]) + (y[j] - y[i])*(y[j] - y[i]) + (z[j] - z[i])*(z[j] - z[i])); dis = dis - r[j] - r[i]; if (dis < 0) dis = 0; d[i][j] = dis; } Floyd(); printf("Cheese %d: Travel time = %.f sec\n", ++kase, 10 * d[n+1][n+2]); } }
相关文章推荐
- UVA 1001 Say Cheese 奶酪里的老鼠(最短路,floyd)
- uva 1001 奶酪里的老鼠(狄杰斯特拉或弗洛伊德)
- UVa 1001 Say Cheese【floyd】
- UVa 1001 Say Cheese (Dijkstra)
- UVa1112 - Mice and Maze(Dijkstra和Floyd_warshall)
- uva 10269 - Adventure of Super Mario(Floyd + Dijkstra + dp)
- uva 10269 Adventure of Super Mario (floyd + dijkstra)
- UVA1001 Say Cheese (dijkstra)
- UVa 10801 - Lift Hopping (Floyd, Dijkstra, SPFA三合一)
- uva 10269(floyd+Dijkstra)
- UVa 1001 Say Cheese (Floyd)
- [Uva 1001] Say Cheese [Floyd]
- UVA-10269 (floyd+dijkstra)
- Adventure of Super Mario - UVa 10269 Floyd+Dijkstra
- uva 1001 dijkstra
- UVA 1001 Say Cheese (三维Floyd)
- 四种最短路径算法(Dijkstra,Floyd,Bellman-ford&&spfa)
- 最大流,Floyd(UNIX插头 uva 753)
- uva 10806 Dijkstra, Dijkstra.
- C++实现矩阵图的遍历·最小生成树(prim,kruskal)·最短路径(Dijkstra,floyd)