您的位置:首页 > 其它

POJ 2253 —— Frogger

2016-01-31 15:30 363 查看
原题:http://poj.org/problem?id=2253

题意:有n个石头,给出每个石头的坐标;青蛙A在第一块石头,青蛙B在第二块石头,A要去找B;

求A到B的所有路径中最小的Frog Distance,Frog Distance定义为青蛙A在某条路径中所跳的最大距离;

#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#define inf 1e9
using namespace std;
const int maxn = 250;
bool vis[maxn];
int dis[maxn], d[maxn][maxn];
int n, T = 0;

struct node
{
int x, y;
}p[maxn];

void Dijkstra()
{
memset(vis, false, sizeof vis);
for(int i = 1;i<=n;i++)
dis[i] = d[i][1];
vis[1] = true;
for(int i = 1;i<=n;i++)
{
int k = -1;
int minn = inf;
for(int j = 1;j<=n;j++)
{
if(!vis[j] && minn >= dis[j])
{
k = j;
minn = dis[j];
}
}
if(k == -1)	break;
vis[k] = true;
for(int j = 1;j<=n;j++)
{
if(!vis[j])
{
int t = max(dis[k], d[k][j]);
dis[j] = min(dis[j], t);
}
}
}
}

int main()
{
while(~scanf("%d", &n))
{
if(n == 0)	break;
for(int i = 1;i<=n;i++)
scanf("%d%d", &p[i].x, &p[i].y);
for(int i = 1;i<=n;i++)
{
int x1 = p[i].x, y1 = p[i].y;
for(int j = 1;j<=n;j++)
{
int x2 = p[j].x, y2 = p[j].y;
d[i][j] = (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2);
}
d[i][i] = 0;
}
Dijkstra();
float ans = sqrt(1.0*dis[2]);
printf("Scenario #%d\n", ++T);
printf("Frog Distance = %.3f\n\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: