POJ 2253-最短路-floyd

原题链接

题意

青蛙从一号点,想跳到二号点,然而距离可能特别大,青蛙可能一次跳不了太远,
所以需要借其他点,从而缩短单次需要跳的最长距离
例如,a->b等于10,如果直接跳,那么单次跳的距离为10
如果有a->c=5,c->b=5,那么先到c,再到b,单次跳的距离就是5

思路

使用floyd,然而不是求最短路,而是求能到单次跳所需要的最大距离
即所有路径中的最大值
因此,原本floyd状态表达式是

g[i][j]=min(g[i][j],g[i][k]+g[k][j]//求总路径之和的最短距离

应改成

g[i][j]=min(g[i][j],max(g[i][k],g[k][j]));//求从i直接到j,是否能通过k点,缩短单次跳所需要最大长度

max(g[i][k],g[k][j])是求出i->kk->j两条路径的最大单次跳的距离
min(g[i][j],max(g[i][k],g[k][j]));则求出是否被替换,从而求出更小的值

#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
using namespace std;

const int N=220,inf=0x3f3f3f3f;
typedef double dl;
typedef pair<int,int > PII;

dl g[N][N]; 
PII p[N];
int n;

//求x跟y之间的直接距离 
dl find(int x,int y){
    double a=p[x].first-p[y].first;
    double b=p[x].second-p[y].second;
    return sqrt(a*a+b*b);
}
int main()
{
    int num=0;
    while(cin>>n,n){
        //接收所有点的坐标 
        for(int i=1;i<=n;i++) cin>>p[i].first>>p[i].second;
        
        //一次求出每两个点之间的距离 
        for(int i=1;i<=n;i++){
            //因为i到j跟j到i的距离是一定的
            //所以遍历的时候,可以直接遍历矩阵的右上角即可 
            for(int j=i+1;j<=n;j++){
                g[i][j]=g[j][i]=find(i,j);
            }
        }
        
        //floyd求出最小单次跳的距离 
        for(int k=1;k<=n;k++){
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    g[i][j]=min(g[i][j],max(g[i][k],g[k][j]));
                }
            }
        }
        if(num) cout<<endl;
        printf("Scenario #%d\nFrog Distance = %.3f\n",++num,g[1][2]);
    }
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 9,115评论 0 2
  • 一年级语文上册生字表 生字表一(共400字) 啊(ā)爱(ài)安(ān)岸(àn)爸(bà)八(bā)巴(bā)...
    meychang阅读 8,150评论 0 6
  • 1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不...
    曲终人散Li阅读 8,651评论 0 19
  • 图的定义与术语 1、图按照有无方向分为无向图和有向图。无向图由顶点和边构成,有向图由顶点和弧构成。弧有弧尾和弧头之...
    unravelW阅读 3,218评论 0 0
  • 今晚我只想写点废言废语,慰藉风尘中正逆流而上的你。 近日和老友通话,谈了毕业半年来诸多事务。世事变迁,真叫人扼腕兴...
    青门外阅读 5,065评论 0 1

友情链接更多精彩内容