POJ 2253 Frogger(最短路Dijkstra or flod)

题意:要从起点的石头跳到终点的石头,设The frog distance为从起点到终点的某一路径中两点间距离的最大值,问在从起点到终点的所有路径中The frog distance的最小值为多少。

分析:

解法一:Dijkstra,修改最短路模板,d[u]表示从起点到u的所有路径中两点间距离的最大值的最小值。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define lowbit(x) (x & (-x))
const double eps = 1e-15;
inline int dcmp(double a, double b){
    if(fabs(a - b) < eps) return 0;
    return a > b ? 1 : -1;
}
typedef long long LL;
typedef unsigned long long ULL;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const int MOD = 1e9 + 7;
const double pi = acos(-1.0);
const int MAXN = 200 + 10;
const int MAXT = 10000 + 10;
using namespace std;
struct Edge{
    int from, to;
    double dist;
    Edge(int f, int t, double d):from(f), to(t), dist(d){}
};
struct HeapNode{
    double d;
    int u;
    HeapNode(double dd, int uu):d(dd), u(uu){}
    bool operator < (const HeapNode& rhs)const{
        return d > rhs.d;
    }
};
struct Dijkstra{
    int n, m;
    vector<Edge> edges;
    vector<int> G[MAXN];
    double d[MAXN];
    bool done[MAXN];
    void init(int n){
        this -> n = n;
        for(int i = 0; i <= n; ++i) G[i].clear();
        edges.clear();
    }
    void AddEdge(int from, int to, double dist){
        edges.push_back(Edge(from, to, dist));
        m = edges.size();
        G[from].push_back(m - 1);
    }
    void dijkstra(int s){
        priority_queue<HeapNode> Q;
        for(int i = 0; i <= n; ++i){
            d[i] = 10000000.0;
        }
        memset(done, false, sizeof done);
        d[s] = 0;
        Q.push(HeapNode(0, s));
        while(!Q.empty()){
            HeapNode x = Q.top();
            Q.pop();
            int u = x.u;
            if(done[u]) continue;
            done[u] = true;
            for(int i = 0; i < G[u].size(); ++i){
                Edge &e = edges[G[u][i]];
                double tmp = max(d[u], e.dist);
                if(tmp < d[e.to]) {
                    d[e.to] = tmp;
                    Q.push(HeapNode(d[e.to], e.to));
                }
            }
        }
    }
}dij;
struct Node{
    int x, y;
    void read(){
        scanf("%d%d", &x, &y);
    }
}num[MAXN];
double getD(Node& a, Node &b){
    return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
int main(){
    int n;
    int kase = 0;
    while(scanf("%d", &n) == 1){
        if(!n) return 0;
        for(int i = 0; i < n; ++i) num[i].read();
        dij.init(n);
        for(int i = 0; i < n; ++i){
            for(int j = i + 1; j < n; ++j){
                double d = getD(num[i], num[j]);
                dij.AddEdge(i, j, d);
                dij.AddEdge(j, i, d);
            }
        }
        dij.dijkstra(0);
        printf("Scenario #%d\nFrog Distance = %.3f\n\n", ++kase, dij.d[1]);
    }
    return 0;
}

解法二:flod,pic[i][j]表示从i到j的所有路径中两点间距离的最大值的最小值。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define lowbit(x) (x & (-x))
const double eps = 1e-8;
inline int dcmp(double a, double b){
    if(fabs(a - b) < eps) return 0;
    return a > b ? 1 : -1;
}
typedef long long LL;
typedef unsigned long long ULL;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const int MOD = 1e9 + 7;
const double pi = acos(-1.0);
const int MAXN = 200 + 10;
const int MAXT = 10000 + 10;
using namespace std;
double pic[MAXN][MAXN];
struct Node{
    int x, y;
    void read(){
        scanf("%d%d", &x, &y);
    }
}num[MAXN];
double getD(Node& a, Node &b){
    return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
int main(){
    int n;
    int kase = 0;
    while(scanf("%d", &n) == 1){
        if(!n) return 0;
        for(int i = 0; i < n; ++i) num[i].read();
        for(int i = 0; i < n; ++i){
            for(int j = i + 1; j < n; ++j){
                double d = getD(num[i], num[j]);
                pic[i][j] = pic[j][i] = d;
            }
        }
        for(int k = 0; k < n; ++k){
            for(int i = 0; i < n; ++i){
                for(int j = i + 1; j < n; ++j){
                    if(pic[i][k] < pic[i][j] && pic[k][j] < pic[i][j]){
                        pic[j][i] = pic[i][j] = max(pic[i][k], pic[k][j]);
                    }
                }
            }
        }
        printf("Scenario #%d\nFrog Distance = %.3f\n\n", ++kase, pic[0][1]);
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/tyty-Somnuspoppy/p/6657201.html