您的位置:首页 > 其它

POJ 2253 Frogger

2016-05-10 22:10 274 查看

POJ 2253 Frogger

[★★☆☆☆]图论 最短路

题目大意:

给出两只青蛙的坐标A、B,和其他的n-2个坐标,任一两个坐标点间都是双向连通的。显然从A到B存在至少一条的通路,每一条通路的元素都是这条通路中前后两个点的距离,这些距离中又有一个最大距离。

现在要求求出所有通路的最大距离,并把这些最大距离作比较,把最小的一个最大距离作为青蛙的最小跳远距离。

样例

输入:

2

0 0

3 4

3

17 4

19 4

18 5

0

输出:

Scenario #1

Frog Distance = 5.000

Scenario #2

Frog Distance = 1.414

解题思路:

水题,用dijkstra算法稍微改一下更新条件就A了。

但是,居然,printf没有%lf,涨知识了。。。就因为这个WA了半天,蛋疼、、

代码

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>

using namespace std;

const int INF = 1e9 + 7;

struct ZB{
double x, y;
};
double cost[205][205];
double d[205];
bool used[205];
int V;
ZB zb[205];

double jl(int a, int b) {
ZB t1 = zb[a];
ZB t2 = zb[b];
double t = sqrt((t1.x - t2.x) * (t1.x - t2.x) + (t1.y - t2.y) * (t1.y - t2.y) );
return t;
}

int main() {
int ct = 1;

while ( (cin >> V) && V != 0) {
for (int i = 1; i <= V; i++) {
cin >> zb[i].x >> zb[i].y;
}
for (int i = 1; i <= V; i++) {
for (int j = 1; j <= V; j++) {
cost[i][j] = jl(i, j);
}
}

fill(d, d+205, INF);
fill(used, used+205, false);
d[1] = 0;

while (1) {
int v = -1;

for (int u = 1; u <= V; u++) {
if(!used[u] && (v == -1 || d[u] < d[v])) v = u;
}

if (v == -1) break;
used[v] = true;

for (int u = 1; u <= V; u++) {
d[u] = min(d[u], max(d[v], cost[v][u]));
}

}

printf("Scenario #%d\n", ct++);
printf("Frog Distance = %.3f\n\n", d[2]);

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj