POJ 2253 Frogger

传送门:http://poj.org/problem?id=2253

解题思路:

参考:http://www.cnblogs.com/freezhan/p/3238967.html

题目求的是青蛙从一个石头跳到另一个石头,它最大的一步只需要多大。

实现代码:

注意:用G++提交没有通过,c++过了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

const int maxn=205;
struct Point{
    double x,y;
}p[maxn];

double w[maxn][maxn];

double dist(Point a,Point b){
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}

void floyd(int n){
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                w[i][j]=min(w[i][j],max(w[i][k],w[k][j]));
}

void init(int n){
    for(int i=1;i<=n;i++){
        w[i][i]=0;
        for(int j=i+1;j<=n;j++)
            w[i][j]=w[j][i]=dist(p[i],p[j]);
    }
}

int main(){
    int n;
    int t=0;
    while(scanf("%d",&n)!=EOF){
        if(n==0) break;
        for(int i=1;i<=n;i++){
            scanf("%lf%lf",&p[i].x,&p[i].y);
        }


        init(n);
        floyd(n);
        printf("Scenario #%d
", ++t);
        printf("Frog Distance = %.3lf

", w[1][2]);

    }
}

 Dijkstra方法:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <cmath>
using namespace std;

const int V=205;
const double INF=99999999999;
struct Point{
    double x,y;
}p[V];

struct NodeHeap{
    int d,u;
    NodeHeap(int _d,int _u){
        d=_d;
        u=_u;
    }
    bool operator <(const NodeHeap &rhs)const{
        return d>rhs.d;
    }
};

double w[V][V],dis[V];
int vis[V];
double dist(Point a,Point b){
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}

void init(int n){
    for(int i=1;i<=n;i++){
        w[i][i]=0;
        for(int j=i+1;j<=n;j++){
            w[i][j]=dist(p[i],p[j]);
            w[j][i]=w[i][j];
        }
    }
}


double Dijkstra(int n){
    init(n);
    double ans=0;
    for(int i=0;i<=n;i++){
        dis[i]=INF;
        vis[i]=0;
    }

    priority_queue<NodeHeap> pq;
    pq.push(NodeHeap(0,1));
      dis[1]=0;
    vis[1]=1;

    while(!pq.empty()){
        NodeHeap x=pq.top();
        pq.pop();
        int u=x.u;
        vis[u]=1;
        if(ans<dis[u]&&dis[u]!=INF){
            ans=dis[u];
        }

        if(u==2) return ans;

        for(int i=1;i<=n;i++){
            if(!vis[i]){
                dis[i]=min(dis[i],w[i][u]);
                pq.push(NodeHeap(dis[i],i));
            }
        }

    }
     return ans;
}

int main(){
    int k=0;
    int n;
    while(scanf("%d",&n)!=EOF){
        if(n==0) break;
        for(int i=1;i<=n;i++){
            scanf("%lf%lf",&p[i].x,&p[i].y);
        }
        printf("Scenario #%d
",++k);
        printf("Frog Distance = %.3f

",Dijkstra(n));

    }
    return 0;
}
自己选的路,跪着也要把它走完------ACM坑
原文地址:https://www.cnblogs.com/IKnowYou0/p/6480335.html