POJ 2253 Frogger

题目链接:http://poj.org/problem?id=2253

题意:

求:所有到达目的地路径中边权值最大的集合中 最小的那个值

换句话说 就是求最短路径中出现的最大权值.


只需要更改dijkstra的更新条件:

/*
最短路中的最长边
改变更新条件
原来:
if(!vis[j]&&dis[j]>dis[pos]+G[pos][j])
    dis[j]=dis[pos]+G[pos][j];
改为
if(!vis[j]&&dis[j]>max(dis[pos],G[pos][j]))
    dis[j]=max(dis[pos],G[pos][j]);
此时,dis[]存的是到达第k个数的最长边的最小值

*/

/*
最短路中的最长边
改变更新条件
原来:
if(!vis[j]&&dis[j]>dis[pos]+G[pos][j])
    dis[j]=dis[pos]+G[pos][j];
改为
if(!vis[j]&&dis[j]>max(dis[pos],G[pos][j]))
    dis[j]=max(dis[pos],G[pos][j]);
此时,dis[]存的是到达第k个数的最长边的最小值

*/


#include<cstdio>
#include<cmath>
#define INF 1000000000
const int N=201;
struct node
{
    double x,y;
    int i;
};
double max(double a,double b){return a>b?a:b;}
node f[N];
double G[N][N];
double low[N];
void calc(const node &a,const node &b){
    double dis=sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2));
    G[a.i][b.i]=G[b.i][a.i]=dis;
}
double dijkstra(int s,int e,int n)
{
    double dis[N];
    bool vis[N]={0};
    int pos=0,i,j;
    double minn;
    for(int i=0;i<n;++i)
        dis[i]=G[pos][i];
    vis[pos]=true;
    dis[s]=0;
    for(i=1;i<n;++i){
        for(minn=INF,j=0;j<n;++j){
            if(!vis[j]&&dis[j]<minn){
                minn=dis[j];
                pos=j;
            }
        }
        vis[pos]=true;
        for(j=0;j<n;++j)if(!vis[j]){
            if(dis[j]>max(G[pos][j],dis[pos])){
                dis[j]=max(G[pos][j],dis[pos]);
            }
        }
        //printf("dis[0]:%lf dis[1]:%lf dis[2]=%lf\n",dis[0],dis[1],dis[2]);
    }
    return dis[e];
}
int main()
{
    int n,cnt=0;

    while(scanf("%d",&n),n){
        for(int i=0;i<n;++i){
            scanf("%lf %lf",
                  &f[i].x,&f[i].y);
            f[i].i=i;
        }



        for(int i=0;i<n;++i)
            for(int j=0;j<n;++j)
                G[i][j]=INF;

        for(int j=0;j<n;++j)
        for(int i=j+1;i<n;++i){
            calc(f[j],f[i]);
        }
        double ans=dijkstra(0,1,n);
        ++cnt;
        printf("Scenario #%d\n",cnt);
        printf("Frog Distance = %.3lf\n\n",ans);

    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值