zoukankan      html  css  js  c++  java
  • POJ

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

    题目意思:有n个石头的坐标,一只青蛙想从第一个坐标的石头跳到第二的石头上,问最短路径时要跳最长的路长为多少?

    思路:就是将dijkstra,floyd中的d[],map[]存储的内容改为最短路中最长边。

    有点无语的是,交到G++去了用printf("%.3lf"),精度有点问题wa了很多很多发。。。。

    花了我两天,还以为算法错了。结果交c++就过了。真的心态爆炸。。。。

    不过发现了一个保存精度的函数setprecision(),头文件是#include<iomanip>,如果要保留无有效位的0时要

    加fixed。用法:cout<<fixed<<setprecision(3)<<"Frog Distance = "<<d[2]<<endl;

    dijkstra:

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #define inf 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    const int maxn=300;
    
    double map[maxn][maxn],d[maxn];
    double x[maxn],y[maxn],vis[maxn];
    int n;
    
    void dijkstra()
    {
        d[1]=0;
        vis[1]=1;
        for(int i=2;i<=n;i++)
        {
            vis[i]=0;
            d[i]=map[1][i];
        }
        for(int i=1;i<n;i++)
        {
            double m=inf;
            int v;
            for(int j=1;j<=n;j++)
            {
                if(!vis[j]&&m>d[j])
                {
                    m=d[j];
                    v=j;
                }
            }
            vis[v]=1;
            if(vis[2])
                break;
            //cout<<v<<endl;
            for(int j=1;j<=n;j++)
            {
                if(!vis[j]&&d[j]>max(d[v],map[v][j]))//与模板不同的就是这 
                    d[j]=max(d[v],map[v][j]);//记录到每个点最短路的最长边 
            }
        }
    }
    int main()
    {
        int k=1;
        while(scanf("%d",&n)!=EOF&&n)
        {
            for(int i=1;i<=n;i++)
            {
                scanf("%lf%lf",&x[i],&y[i]);
            }
            memset(map,0,sizeof(map));
            for(int i=1;i<=n;i++)
            {
                for(int j=i+1;j<=n;j++)
                {
                    double sum=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
                    map[i][j]=map[j][i]=sum;
                }
            }
            dijkstra();
            printf("Scenario #%d
    Frog Distance = %.3lf
    
    ",k,d[2]);
            k++;
        }
        return 0;
    }

    floyd:

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<iomanip>
    #define inf 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    const int maxn=300;
    
    
    int main()
    {
        int n,t=1;
        double map[maxn][maxn];
        double x[maxn],y[maxn];
        while(cin>>n&&n)
        {
            memset(map,inf,sizeof(map));
            memset(x,0,sizeof(x));
            memset(y,0,sizeof(y));
            for(int i=1;i<=n;i++)
                cin>>x[i]>>y[i];
            for(int i=1;i<n;i++)
            {
                for(int j=i+1;j<=n;j++)
                {
                    double xx=x[i]-x[j];
                    double yy=y[i]-y[j];
                    map[i][j]=map[j][i]=sqrt(xx*xx+yy*yy);
                }
            }
            for(int k=1; k<=n; k++)
                for(int i=1; i<=n; i++)
                    for(int j=1; j<=n; j++)
                    {
                        if(map[i][j]>max(map[i][k],map[k][j]))
                            map[i][j]=max(map[i][k],map[k][j]);
                    }
                        
            cout<<"Scenario #"<<t++<<endl;
            cout<<fixed<<setprecision(3)<<"Frog Distance = "<<map[1][2]<<endl;
            cout<<endl;
        }
        return 0;
    }
  • 相关阅读:
    requests实现接口自动化(三)
    api 25 PopupWindow会占据整个屏幕
    INSTALL_FAILED_USER_RESTRICTED
    事件分发_水平滑动和垂直冲突解决
    MPAndroidChart market右边显示不全问题
    SimpleDateFormat 取当前周的周一和周日的日期,当前月第一个和最后一天的日期
    Callable,Runnable比较及用法
    Android系统启动流程
    debug-stripped.ap_' specified for property 'resourceFile' does not exist
    Theme.AppCompat.Light的解决方法
  • 原文地址:https://www.cnblogs.com/xiongtao/p/10022929.html
Copyright © 2011-2022 走看看