HDU1245Saving James Bond (Floyd 算法求最短路)
2014-05-01 22:11
323 查看
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1245
Floyd 算法求最短路
计算几何
由于精度问题。这道题目要C++才能AC, G++不能AC。
Floyd 算法求最短路
计算几何
由于精度问题。这道题目要C++才能AC, G++不能AC。
#include <cstdio> #include <iostream> #include <cstring> #include <cmath> using namespace std; struct node { double x; double y; }a[110]; double map[110][110]; int step[110][110]; int s[110]; int t[110]; const double INF = 100000000; const double eps = 1e-8; double min(double x, double y) { return x<y?x:y; } void floyd(int n) { int i, j, k; for(k = 0; k <= n; k++) for(i = 0; i <= n; i++) for(j = 0; j <= n; j++) if(map[i][j] > map[i][k]+map[k][j]) { map[i][j] = map[i][k]+map[k][j]; step[i][j] = step[i][k]+step[k][j]; } } int main() { int n, i, j, num; double d, dd; double x, y; while(cin>>n>>d) { for(i = 1, j = 1; i <= n; i++) { scanf("%lf%lf", &x, &y); if(fabs(x)<=7.5 && fabs(y)<=7.5) continue; a[j].x = x; a[j].y = y; j++; } num = j; if(num == 1) { if(d >= 42.5) printf("42.50 1\n"); else printf("can't be saved\n"); continue; } for(i = 0; i <= num; i++) for(j = 0; j <= num; j++) { map[i][j] = INF; step[i][j] = 0; } for(i = 1; i < num; i++) for(j = 1; j < num; j++) { if(j==i) { map[i][j] = 0; continue; } map[i][j] = sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y)); step[i][j] = 1; if(map[i][j] > d) { map[i][j] = INF; step[i][j] = 0; } } int len1 = 0; int len2 = 0; for(i = 1; i < num; i++) { if(sqrt(a[i].x*a[i].x+a[i].y*a[i].y)-7.5 <= d) s[len1++] = i; if(50-fabs(a[i].x)<=d || 50-fabs(a[i].y)<=d) t[len2++] = i; } for(i = 0; i < len1; i++) { map[0][s[i]] = map[s[i]][0]= sqrt(a[s[i]].x*a[s[i]].x+a[s[i]].y*a[s[i]].y)-7.5; step[0][s[i]] = step[s[i]][0] = 1; } for(i = 0; i < len2; i++) { map[t[i]][num] = map[num][t[i]] = min(50-fabs(a[t[i]].x), 50-fabs(a[t[i]].y)); step[t[i]][num] = step[num][t[i]] = 1; } floyd(num); if(map[0][num] == INF) printf("can't be saved\n"); else printf("%.2lf %d\n", map[0][num], step[0][num]); } return 0; }
相关文章推荐
- 算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法
- 算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法
- 带权最短路 Dijkstra, SPFA, Bellman-Ford, ASP, Floyd-Warshall 算法分析
- 模板--Floyd Dijkstra Bellman-Ford spfa 四种最短路经典算法
- 【数据结构】有向图、无向图以及最短路(Dijkstra, Floyd)算法的C#实现(纯模板Template实现)
- HDU 2544 最短路 Dijkstra 算法、 Floyd 算法 Bellman_ford算法
- floyd 算法 最短路 模板
- 【算法】全局最短路——Floyd-Warshall算法
- 算法笔记---最短路路径之Floyd(弗洛伊德)算法
- FloydWarshall 算法包含BellmanFord 和Dijkstra算法求单元最短路SSSP,可以有负权,有圈
- 最短路 Dijkstra 和 Floyd 算法
- 最短路(Floyd(弗洛伊德)算法)B - 畅通工程续(3个for循环)
- hdu1690Bus System(Floyd 算法求最短路)
- 最短路的三种算法(Floyd、Dijkstra、SPFA)
- 算法学习之Floyd-warshall多源最短路问题
- Bellman变形得来的SPFA最短算法(不能含负环);Floyd求两点间最短路,求有向图的闭包;
- 带权最短路 Dijkstra, SPFA, Bellman-Ford, ASP, Floyd-Warshall 算法分析
- Floyd Dijkstra Bellman-Ford spfa 四种最短路经典算法汇总 HDU 2544为例
- 最短路之Floyd(弗洛伊德)算法
- 图论01——最短路矩阵(FLOYD)算法