zoukankan      html  css  js  c++  java
  • Frogger--poj2253

    http://poj.org/problem?id=2253

    题意:The frog distance (humans also call it minimax distance) between two stones therefore is defined as the minimum necessary jump range over all possible paths between the two stones.
    这句话很重要,题中求得是青蛙一次至少跳多远才能成功到达对方所在的地方;即求所有路径中每条路径中的最大距离的最小值(求一条1~2的路径使得路径上的最大边权最小)

    floyd中更新距离改成更新最小的最大边权;

    #include<iostream>
    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #include<algorithm>
    #define INF 0xfffffff
    #define N 1100
    using namespace std;
    int n;
    double maps[N][N];
    
    struct node
    {
        int x,y;
    }a[N];
    void Floyd()
    {
        int i,j,k;
        for(k=1;k<=n;k++)
        {
            for(i=1;i<=n;i++)
            {
                for(j=1;j<=n;j++)
                {
                    maps[i][j]=min(maps[i][j],max(maps[i][k],maps[k][j]));
                }
            }
        }
    }
    
    int main()
    {
        int i,j,k,x,y,t=1;
    
        while(scanf("%d",&n),n)
        {
            memset(a,0,sizeof(a));
    
            k=1;
    
            for(i=1;i<=n;i++)
            {
                scanf("%d%d",&x,&y);
    
                for(j=1;j<=k;j++)
                {
                    double d=sqrt((x-a[j].x)*(x-a[j].x)+(y-a[j].y)*(y-a[j].y));
    
                    maps[i][j]=maps[j][i]=d;
                }
    
                a[k].x=x,a[k].y=y,k++;
            }
            for(i=1;i<=n;i++)
    
                maps[i][i]=0;
    
            Floyd();
    
            printf("Scenario #%d
    Frog Distance = %.3f
    
    ",t++,maps[1][2]);
        }
        return 0;
    }
    View Code

     用Dij算法就相当与prim;

    dist[i] 代表i点之前的那个点到i的最短距离;求最短中的最长;

    #include<iostream>
    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #include<algorithm>
    #define INF 0xfffffff
    #define N 1100
    using namespace std;
    int n,vis[N];
    double maps[N][N],dist[N],ans;
    struct node
    {
        int x,y;
    }a[N];
    void Dij()
    {
        int i,j,index;
        dist[1]=0;
        for(i=1;i<=n;i++)
        {
            double Min=INF;
            for(j=1;j<=n;j++)
            {
                if(vis[j]==0&&Min>=dist[j])
                    Min=dist[j],index=j;
            }
            vis[index]=1;
            if(ans<dist[index]&&dist[index]!=INF)
                ans=dist[index];
            if(index==2)
                return ;
            for(j=1;j<=n;j++)
            {
                if(vis[j]==0)
                    dist[j]=min(dist[j],maps[index][j]);
            }
        }
    }
    int main()
    {
        int i,j,k,x,y,t=1;
        while(scanf("%d",&n),n)
        {
            memset(vis,0, sizeof(vis));
            memset(a,0,sizeof(a));
            for(i=0;i<=n;i++)
                dist[i]=INF;
            k=1;
            for(i=1;i<=n;i++)
            {
                scanf("%d%d",&x,&y);
                for(j=1;j<=k;j++)
                {
                    double d=sqrt((x-a[j].x)*(x-a[j].x)+(y-a[j].y)*(y-a[j].y));
                    maps[i][j]=maps[j][i]=d;
                }
                a[k].x=x,a[k].y=y,k++;
            }
            for(i=1;i<=n;i++)
                maps[i][i]=0;
            ans=0;
            Dij();
            printf("Scenario #%d
    Frog Distance = %.3f
    
    ",t++,ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    hdu 4309(最大流+枚举状态)
    hdu 1565+hdu 1569(最大点权独立集)
    hdu 3657(最大点权独立集)
    hdu 3491(最小割+拆点)
    hdu 4394(bfs)
    An Introduction to Numerical Analysis Example 6.1
    陶哲轩谈数学家的合作(来自陶哲轩在数学家Gowers的博文“Is massively collaborative mathematics possible?”上的评论)
    拉格朗日插值多项式之间的递推关系
    三角形的余弦定理
    三角形的余弦定理
  • 原文地址:https://www.cnblogs.com/zhengguiping--9876/p/4667159.html
Copyright © 2011-2022 走看看