POJ - 2253(dijkstra和Floyd变形)

题目链接: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\nFrog Distance = %.3lf\n\n",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;
}

猜你喜欢

转载自www.cnblogs.com/xiongtao/p/10022929.html