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


相关推荐

  • ajax和axios的使用和区别

    ajax和axios的使用和区别Ajax 与 Axios 一 概述 1 1 浏览器发送的请求类型 1 1 1 同步请求同步请求的特点 按照代码顺序依次发起 一个请求未得到响应时 后续请求会被阻塞 同步发起方式在地址栏输入 URL 同步的 get 请求 的 ref 同步的 get 请求 带有 src 同步的 get 请求 同步的 get post 请求 1 1 2 异步请求发起方式 js 代码发起发起异步请求的工具 XmlHttpReque 对象 异步请求的特点 创建一个新线程发起请求 获取响应 在

    2026年3月18日
    2
  • 二阶有源滤波器设计

    二阶有源滤波器设计1引入为什么要用有源二阶滤波器?(1)从有源来说对于无源二阶低通滤波器:其幅頻方程为:我们从中可以看出其通带截止频率为有其品质因子为0.372。我们根据上图得到二阶无源低通滤波器的品质因子只有0.372,如果希望Q大于0.5,就需要在ω=ωo附近增大幅度响应。实现这个目的的一种方法就是增加一个可控的正反馈控制量,这种反馈仅仅在ω=ωo附近奏效,参见下…

    2022年5月4日
    57
  • MySQL最常用分组聚合函数「建议收藏」

    MySQL最常用分组聚合函数

    2022年2月10日
    48
  • Python3_打开和运行方式

    Python3_打开和运行方式蹬蹬蹬……第一次写博客,如有错误欢迎指正。Python很火,前几天也是因为需要装了一下,但是并没有用它,今天打开准备刚准备试下,才发现自己对这个软件一无所知,百度了一些资料发现并不能用才知道pyth

    2022年7月6日
    27
  • Vim编辑完如何保存退出

    Vim编辑完如何保存退出编辑完按Esc退出编辑模式此时输入::wq保存后退出:wq!强制保存后退出:w保存但不退出:w!若文件属性为只读时,强制写入该文档:q不保存并退出:q!不保存并强制退出…

    2022年8月24日
    8
  • hash冲突以及hash冲突的解决方法

    hash冲突以及hash冲突的解决方法首先说一下hash冲突吧,hash冲突在hash表中一般情况下是会遇到的;hash冲突指的是你在向hash表中存数据时,首先要通过key值进行指定的hash算法进行计算,然后得到一个值,这个值就是你要将这个key对应的value存入的地址。但是在这个地址中已经有值存在,所以这个时候就发生了hash冲突,不同的key通过hash算法得到了对应的同一个值。hash冲突解决的方法:再hash法:这种方法就是有多个hash算法,当使用一个hash算法计算得到值发生hash冲突时那就使用另外一个hash算法

    2022年10月8日
    3

发表回复

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

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