Floyed算法[通俗易懂]

Floyed算法[通俗易懂]这一讲简单介绍一下Floyed算法。话不多说,先放一道题帮助理解(其实是懒得描述具体应用场景)。FroggerFreddyFrogissittingonastoneinthemiddleofalake.SuddenlyhenoticesFionaFrogwhoissittingonanotherstone.Heplanstovisit

大家好,又见面了,我是你们的朋友全栈君。

这一讲简单介绍一下Floyed算法。
话不多说,先放一道题帮助理解(其实是懒得描述具体应用场景)。
Frogger

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 since the water is dirty and full of tourists' sunscreen, he wants to avoid swimming and instead reach her by jumping.
Unfortunately Fiona's stone is out of his jump range. Therefore Freddy considers to use other stones as intermediate stops and reach her by a sequence of several small jumps.
To execute a given sequence of jumps, a frog's jump range obviously must be at least as long as the longest jump occuring in the sequence.
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.

You are given the coordinates of Freddy's stone, Fiona's stone and all other stones in the lake. Your job is to compute the frog distance between Freddy's and Fiona's stone.

Input
The input will contain one or more test cases. The first line of each test case will contain the number of stones n (2<=n<=200). The next n lines each contain two integers xi,yi (0 <= xi,yi <= 1000) representing the coordinates of stone #i. Stone #1 is Freddy’s stone, stone #2 is Fiona’s stone, the other n-2 stones are unoccupied. There’s a blank line following each test case. Input is terminated by a value of zero (0) for n.
Output
For each test case, print a line saying “Scenario #x” and a line saying “Frog Distance = y” where x is replaced by the test case number (they are numbered from 1) and y is replaced by the appropriate real number, printed to three decimals. Put a blank line after each test case, even after the last one.
Sample Input

2
0 0
3 4

3
17 4
19 4
18 5

0

Sample Output

Scenario #1
Frog Distance = 5.000

Scenario #2
Frog Distance = 1.414

严格来说,这并不是一道标准的Floyed题,题意是:在所有通路中,找到每一条通路中的最大距离,在这所有的距离中,找到一个最小值。
之所以也放到这里,首先是因为Floyed算法标志性的三重循环,其次也是想借此拓展一下该算法灵活的应用方式


#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define maxsize 1010
#define inf 99999999
int x[maxsize],y[maxsize],sum=1;
double dis[maxsize][maxsize];//用来记录任意两点通路的单步最大长度

//计算两点间的距离
double caldistance(int x1,int y1,int x2,int y2)
{
    return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}
int main()
{
    int m;
    while(scanf("%d",&m)!=EOF)
    {
        if(m==0)
        {
            break;
        }
        int i,j,k;

        //输入每个点的坐标
        for(i=1;i<=m;i++)
        {
            scanf("%d %d",&x[i],&y[i]);
        }

        //计算任意两个点间的距离
        for(i=1;i<=m;i++)
        {
            for(j=i;j<=m;j++)
            {
                if(j==i) dis[i][j]=0;
                else
                dis[i][j]=dis[j][i]=caldistance(x[i],y[i],x[j],y[j]);
            }
        }
        //算法标志性的三重循环
        //特别暴力的找到所有情况然后更新
        for(i=1;i<=m;i++)
        {
            for(j=1;j<=m;j++)
            {
                for(k=1;k<=m;k++)
                {
                    if(dis[j][k]>max(dis[j][i],dis[i][k]))
                    {
                        dis[j][k]=max(dis[j][i],dis[i][k]);
                        //注意i,j,k的顺序和位置,最初写错了,怎么都找不到问题错在哪里,一定要注意,
                        //如果是找最短路径的正宗Floyed,比较的就是dis[j][k]和dis[j][i]+dis[i][k]的大小,取小的那个
                    }

                }
            }
        }

        printf("Scenario #%d\nFrog Distance = %.3f\n\n", sum++, dis[1][2]);
    }
    return 0;
}

这个题巧妙的一点改动就实现了功能的“巨大”改变。

算法的核心就是那个三重循环及其嵌套顺序。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/147969.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月29日 下午5:00
下一篇 2022年6月29日 下午5:16


相关推荐

  • Python语言程序设计基础(1)—— 程序设计基本方法

    Python语言程序设计基础(1)—— 程序设计基本方法Everybodyinthiscountryshouldlearnhowtoprogramacomputer,becauseitteachesyouhowtothink

    2022年7月5日
    20
  • 如何快速搭建图片服务器[通俗易懂]

    前言最近学习一个分布式集群的项目,正常一般的工程是把图片放在web项目的自身服务器的工程中,但在集群环境下,会出现找不到图片的情况。代码参考:https://github.com/zyjcxc/taotao.git比如:解决办法:linux做磁盘的映射,说能解决,但服务器多了也不好弄,所以可以再搭建一个图片服务器图片服务器两个服务:http:可以使用nginx…

    2022年4月10日
    61
  • [初学笔记] tic toc 计算程序运行时间

    [初学笔记] tic toc 计算程序运行时间tictoc 可用于计算程序运行的时间 写在 m 文件里面可以计算 for 循环里面的 也可以计算整个大程序的如果有好几次计算 并且需要保留时间 那么可以赋值 tica 111b 2222c 444toctime1 toc disp time1 但是如果想单独计算每一段的时间 需要跟上 ticticze

    2026年3月18日
    1
  • springcloud详细教程_史上最简单的画

    springcloud详细教程_史上最简单的画SpringCloudBus将分布式的节点和轻量的消息代理连接起来。这可以用于广播配置文件的更改或者其他的管理工作。一个关键的思想就是,消息总线可以为微服务做监控,也可以作为应用程序之间相互通讯。本文要讲述的是用AMQP实现通知微服务架构的配置文件的更改。一、准备工作本文还是基于上一篇文章来实现。按照官方文档,我们只需要在配置文件中配置spring-cloud-starter-bus-amq

    2025年7月26日
    6
  • 《FFmpeg从入门到精通》读书笔记(一)

    《FFmpeg从入门到精通》读书笔记(一)写在前面最近在读《FFmpeg从入门到精通》这本书,结合着雷神的博客,学习音视频的知识~在学习的过程中,也记录了一些摘要。因为是边看边记的,所以一些要点在看到后面的时候,需要反过来整理前面的。我用有道云笔记写的markdown没法加图片,所以就先把这部分发了出来。后续会针对内容和排版一步步的优化,如果你被这凌乱的内容辣到了眼睛,请谅解哈哈哈~2019.06.18第一章+第二章知识点(未…

    2022年6月26日
    46
  • 详解Jvm内存结构

    详解Jvm内存结构近期在学习研究内存,那么Jvm内存结构和Jvm的内存模型即JMM(Javamomerymodel)这两项内容都是学习java虚拟机、java内存知识的基础。为了让自己加深理解,有不至于嵌入到底层细节太深,会通过一段代码片段类比到内存结构图中的真实呈现。一、Jvm体系的内存结构图JVM运行数据区,也就是我们所说的内存结构主要分为两个大区:1、线程共享区**方法区(MethodArea)????*存储运行时的常量池、被虚拟机加载过的类信息、常量、静态变量、即时编译器编译后的代码数据。**堆区(

    2022年5月8日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号