您的位置:首页 > 其它

HDU1245Saving James Bond (Floyd 算法求最短路)

2014-05-01 22:11 323 查看
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1245
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: