POJ2253 最短路径变形

原题链接:

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; 
}
发布了56 篇原创文章 · 获赞 49 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/IBelieve2016/article/details/75991427