poj 2253 Frogger (最小最大路段)【dijkstra】

<题目链接>

题目大意:

给出青蛙A,B和若干石头的坐标,现青蛙A想到青蛙B那,A可通过任意石头到达B,问从A到B多条路径中最小的最长边。

解题分析:

这是最短路的一类典型题目,与普通的最短路的不同之处在于松弛操作。

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

#define N 205
int n;
struct Node{
    int x,y;
    Node(int _x=0,int _y=0):x(_x),y(_y){}
}node[N];
bool vis[N];
double dist[N];
double dis(Node a,Node b){
    return (double)sqrt(1.0*(a.x-b.x)*(a.x-b.x)+1.0*(a.y-b.y)*(a.y-b.y));
}
void Dij(){
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++)dist[i]=dis(node[1],node[i]);
    for(int i=1;i<=n;i++){
        int cur;double mn=1e9;
        for(int j=1;j<=n;j++){
            if(!vis[j] && dist[j]<mn)
                mn=dist[j],cur=j;
        }
        vis[cur]=1;
        for(int j=1;j<=n;j++){
            if(!vis[j] && dist[j]>max(dist[cur],dis(node[cur],node[j]))){    //得到最小的最大路段值
                dist[j]=max(dist[cur],dis(node[cur],node[j]));
            }
        }
    }
}
int main(){
    int ncase=0;
    while(scanf("%d",&n)!=EOF,n){
        for(int i=1;i<=n;i++){
            int u,v;scanf("%d%d",&u,&v);
            node[i]=Node(u,v);
        }
        Dij();
        printf("Scenario #%d\n",++ncase);
        printf("Frog Distance = %.3lf\n\n",dist[2]);
    }
}

 

 

2018-08-26

posted @ 2018-08-26 22:04  悠悠呦~  阅读(216)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end