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;
}

原文地址:https://www.cnblogs.com/xiongtao/p/10022929.html

时间: 2024-10-08 01:31:27

POJ - 2253(dijkstra和Floyd变形)的相关文章

poj 2253 Frogger(floyd变形)

题目链接:http://poj.org/problem?id=1797 题意:给出两只青蛙的坐标A.B,和其他的n-2个坐标,任一两个坐标点间都是双向连通的.显然从A到B存在至少一条的通路,每一条通路的元素都是这条通路中前后两个点的距离,这些距离中又有一个最大距离.现在要求求出所有通路的最大距离,并把这些最大距离作比较,把最小的一个最大距离作为青蛙的最小跳远距离. 有一个明显的方法就是dfs一遍但是肯定会te,所以可以考虑一下用dp的思想. 类似记忆化搜索的思想,由于数据比较小所以不用记忆化搜索

poj 2253 最短路floyd **

题意:有两只青蛙和若干块石头,现在已知这些东西的坐标,两只青蛙A坐标和青蛙B坐标是第一个和第二个坐标,现在A青蛙想要到B青蛙那里去,并且A青蛙可以借助任意石头的跳跃,而从A到B有若干通路,问从A到B的所有通路上的最大边 链接:点我 floyd变形即可 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath>

Poj(2253),Dijkstra松弛条件的变形

题目链接:http://poj.org/problem?id=2253 题意: 给出两只青蛙的坐标A.B,和其他的n-2个坐标,任一两个坐标点间都是双向连通的.显然从A到B存在至少一条的通路,每一条通路的元素都是这条通路中前后两个点的距离,这些距离中又有一个最大距离. 现在要求求出所有通路的最大距离,并把这些最大距离作比较,把最小的一个最大距离作为青蛙的最小跳远距离. 思路: j从1,2,两条路中选取较小者,而1这条路,是s—>k—>j的最大步伐. #include <stdio.h&g

POJ - 2253 Frogger(Floyd最短路+预处理)

题目链接:http://poj.org/problem?id=2253 题意:青蛙要从点1到点2,给出各点的坐标,如果点A到点B可以通过A->C,C->B,A到B的距离可以用A->C和C-B中较长的一边代替(如果A直接到B更短的话就不用了),求点1到点2的最短距离. 题解:本来想用dijkst,但是想想就200的数据量,直接Floyd岂不美滋滋.先预处理一下各点之间的距离.因为取两条边中较长的那条边,所以转移的话,那转移的两条边都要比原来的短才可以. 值得注意的是用C的格式输入的时候要用

[ACM] POJ 2253 Frogger (最短路径变形,每条通路中的最长边的最小值)

Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 24879   Accepted: 8076 Description Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sitting on another stone. He plans to visit her,

Frogger - poj 2253 (Dijkstra)

Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 28802   Accepted: 9353 Description Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sitting on another stone. He plans to visit her, but sinc

poj 2253 Frogger【最小生成树变形】【kruskal】

Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 30427   Accepted: 9806 Description Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sitting on another stone. He plans to visit her,

POJ 2253 - Frogger (floyd)

A - Frogger Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sitting on another stone. He plans to

poj 2253 Frogger (dijkstra最短路)

题目链接:http://poj.org/problem?id=2253 Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 25773   Accepted: 8374 Description Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sitting on an