原题链接:
http://poj.org/problem?id=2253
题目大意:
意思好难懂啊,没看明白题目什么意思。看了其他人的博客,明白大概意思了。
有两个青蛙蹲在池塘中的两块石头上,其中一个青蛙想蹦到另外那个青蛙那里。中间有很多其他的石头,题目给出了每块石头的坐标。青蛙希望每一跳都能尽可能的短,所以需要求出所有路径中,找出最长的那一跳,然后把这n个最长的跳求最短,输出就是这个最长跳中最短的那个距离。
flod代码(没AC)
下面是flod的代码,其实和以前正常的最短路径算法相比,只是在更新的时候不一样。因为之前,如果经过中间的节点可以使距离更短的话,就更新距离数组。在这里,如果经过中间的节点可以使每一跳的距离变短,也是同样更新距离数组。(这两个距离数组代表的意思是不一样的,需要注意)。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
double path[205][205]; //这个path和以往的flod的不一样
//这里path代表,从i到j的所有路径上,首先求出所有的路径,然后找到每条路径的最大跳,再从这些最大跳中选出最小的来
double d[205][2];
int main() {
int n;
int cases = 1;
while (true) {
scanf("%d", &n);
if (n == 0) break;
for (int i = 0; i < n; i++) {
scanf("%lf%lf", &d[i][0], &d[i][1]); //注意:读入double类型时用%lf
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
double xx = d[i][0] - d[j][0];
double yy = d[i][1] - d[j][1];
path[i][j] = sqrt(xx * xx + yy * yy);
}
}
//flod
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (path[i][k] < path[i][j] && path[k][j] < path[i][j]) //如果经过中间的一个石头,可以使跳的距离缩短,就可以更新
path[i][j] = max(path[i][k], path[k][j]); //更新的时候需要使用较长的那个距离,否则就跳不过去了
}
}
}
if (cases != 1) printf("\n");
printf("Scenario #%d\nFrog Distance = %.3lf\n", cases++, path[0][1]);
}
return 0;
}
dijstra代码(没AC)
#include <algorithm>
#include <cstring>
#include <stdio.h>
#include <cmath>
#include <iostream>
using namespace std;
double dis[205]; //单源最短路径,表示从第0个点到第i个点的最短路径,需要不断更新这个数组
int s[205]; //s集合,每次添加一个不在s集合中的,且距离最近的一个节点
double point[205][2]; //存储第i个点的坐标,分别用point[i][0],point[i][1]来表示。也可以使用结构体
double temp[205][205]; //本题还需要一个数组,存储每两个点之间的距离
int main() {
int n;
int cases = 1;
while (true) {
scanf("%d", &n);
if (n == 0) break;
for (int i = 0; i < n; i++) {
scanf("%lf%lf", &point[i][0], &point[i][1]);
}
dis[0] = 0;
for (int i = 1; i < n; i++) {
double xx = point[i][0] - point[0][0];
double yy = point[i][1] - point[0][1];
dis[i] = sqrt(xx*xx + yy*yy);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
double xx = point[i][0] - point[j][0];
double yy = point[i][1] - point[j][1];
temp[i][j] = sqrt(xx*xx + yy*yy);
}
}
memset(s, 0, sizeof(s));
s[0] = 1;
for (int i = 0; i < n; i++) {
double minn = 0x3f3f3f3f;
int u;
for (int j = 0; j < n; j++) {
if (s[j] == 0 && minn > dis[j]) {
minn = dis[j];
u = j;
}
}
s[u] = 1;
for (int j = 0; j < n; j++) { //更新那些不在s集合里边的点
if (s[j] == 0 && dis[j] > max(dis[u], temp[u][j]))
dis[j] = max(dis[u], temp[u][j]);
}
}
if (cases != 1) printf("\n");
printf("Scenario #%d\nFrog Distance = %.3lf\n", cases++, dis[1]);
}
return 0;
}