精华内容
下载资源
问答
  • 我们在地图上看航线的时候,特别是长距离跨国航线,发现在地图上的航线并不是两点间的直线,而是弯曲的弧线。...而地球是球形的,很多人没有意识到在球体中,平面上这段距离并不是这两点间最短距离。我们通过Goog...

    我们在地图上看航线的时候,特别是长距离跨国航线,发现在地图上的航线并不是两点间的直线,而是弯曲的弧线。

    比如上海到美国旧金山,很多人会疑惑,为什么不能直接穿越太平洋,这样不是会更近更快吗?下面是从地图上看,两点间直接穿过太平洋。

    238d9b64766d58b3aaf8142ea5a79c2d.png

    其实这一段距离并不是最近的。这张地图是平面的,所以看起来两点间这段距离最近。而地球是球形的,很多人没有意识到在球体中,平面上这段距离并不是这两点间的最短距离。

    我们通过Google地球来看看上海到旧金山最短的距离,如下图:

    8d7ba64b90206d5945e3344847221344.png

    这条线是上海到旧金山最短的路径,从上海出发,经过韩国,穿过位于俄罗斯远东堪察加半岛与日本北海道岛之间的千岛群岛,还经过一部分白令海峡,再跨过北部阿拉斯加附近的太平洋到达旧金山。

    通过墨卡托投影,把这条路径投影到平面上,大约如下绿线(并不准确,只是示意):

    3a4e10e029018acfa973e1f4074d5784.png

    这条绿线才是上海到旧金山最近的路线。

    有一些路线看起来更夸张,如下北京到加拿大纽芬兰的圣约翰:

    4ae9fca705188c131fdf20659fb5197e.png

    这是Google地球的最短路径,穿过了北极。

    而在平面地图如下红线是平面直线,绿线是球体最短路径投影(并不准确,只是示意):

    a9e781bfcd22c5c4c825d187c53041fe.png

    绿线路程要比红线路程短很多,这一切都是因为我们生活在一个球体上面。

    我们容易被定式思维所局限,当你想通了,打开思维,换一种思维方式,就会发现另一片新天地。

    (网图侵删)

    --------每天了解一点科学科技新闻与知识

    展开全文
  • Mindis题目链接:Mindis题意:圆内或者圆周上有两个点pp和qq,圆心为oo,并且op=oqop=oq,让你在圆上找一点dd...还有就是极端情况,做出反演点(什么是反演点)如果直线p′q′p'q'与圆有交点,则答案为两点间距离 否则

    Mindis

    题目链接:Mindis

    题意:圆内或者圆周上有两个点pq,圆心为o,并且op=oq,让你在圆上找一点d,使得dp+dq最小

    官方题解:
    这里写图片描述

    为什么是中垂线上的点取得最小值?
    个人理解应该是类似于这种情况吧,不过任谁做这道题时首先想到的应该都是中垂线吧。。
    这里写图片描述

    还有就是极端情况,做出反演点(什么是反演点

    如果直线pq与圆有交点,则答案为两点间距离
    否则答案就在中垂线上取到

    看着题解写代码很简单,问题就是这些结论怎么证的(蒻蒻记住结论,求路过的大佬解惑)。。。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    
    const double eps=1e-8;
    
    struct point//点
    {
        double x,y;
        point() {}
        point(double X,double Y)
        {
            x=X,y=Y;
        }
    };
    
    double xmult(point p1,point p2,point p0)//叉积
    {
        return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
    }
    
    double dis(point p1,point p2)//两点间距离
    {
        return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
    }
    
    double disptoline(point p,point l1,point l2)//点到直线的距离
    {
        return fabs(xmult(p,l1,l2))/dis(l1,l2);
    }
    
    int intersect_line_circle(point c,double r,point l1,point l2)//判定直线是否与圆相交
    {
        return disptoline(c,l1,l2)<r+eps;
    }
    
    int main()
    {
        int T_T;
        double r,ans;
        point p,q,o(0,0);
        scanf("%d",&T_T);
        while(T_T--)
        {
            scanf("%lf%lf%lf%lf%lf",&r,&p.x,&p.y,&q.x,&q.y);
            double op=dis(p,o);
            if(p.x==q.x&&p.y==q.y)//特判两点在同一位置
                ans=2.0*(r-op);
            else
            {
                point p1(r*r/op/op*p.x,r*r/op/op*p.y),q1(r*r/op/op*q.x,r*r/op/op*q.y);//p'和q'
                if(intersect_line_circle(o,r,p1,q1))//判定直线是否与圆相交
                    ans=dis(p1,q1)*op/r;
                else
                {
                    point mid((q1.x+p1.x)/2,(q1.y+p1.y)/2);//两个反演点的中点
                    double k=r/dis(mid,o);//比例
                    point d(k*mid.x,k*mid.y);//得到中垂线上的点
                    ans=2*dis(d,q);//两点到中垂线的距离相等所以×2
                }
            }
            printf("%.7lf\n",ans);
        }
        return 0;
    }
    

    ps:解释一下代码中的ans=dis(p1,q1)*op/r
    反演点有一个定理:

                               dpdp=opop   (d为圆上任意一点)

    opop=r2

    dp=dpop2r2=dpopr
    同理可得dq=dqop2r2=dqoqr
    op=oq,因此ans=dis(p1,q1)*op/r

    展开全文
  • 一个最简单的例子:如果你是一个滑雪运动员,目标是最短时间冲线,你根本就不在乎两点间最短路径,而是最快路径。如果你沿着最佳曲线下滑,你会获得更多的优势……顺势借力 开拓创新从起点到终点,有无数条道路,...

    ec5d790abe7aafc1a96d3bad7ab61648.gif

    看图说话,图片很形象地给了答案。大伙是不是也大感意外呢?

    f3fd7057f9c15c506dd94c15ac69f32e.gif

    经过无数学霸的论证和科学实验,上图红色路线是最快的路线,此曲线也因此被称为“最速曲线”。

    话说这曲线有什么用呢?

    一个最简单的例子:如果你是一个滑雪运动员,目标是最短时间冲线,你根本就不在乎两点间的最短路径,而是最快路径。如果你沿着最佳曲线下滑,你会获得更多的优势……

    顺势借力 开拓创新

    从起点到终点,有无数条道路,直线是大多数人会选择的路线。

    一旦没有走到直线,他们就会觉得自己绕了远,开始抱怨。

    其实,真正正确的选择是曲线,才是真正的成功。

    从起点到终点,小球能够滚动,在于其不安现状的同时能够顺势而行,借力地心引力才能让自己不断向前。

    不忘初衷 方得始终

    从起点到终点,小球一直看着终点的目标,自始至终都是朝着自己的目标前行,即使途中有短暂地偏离方向也不放弃自己所追求的终点,而恰恰是这种坚持与执着成就了最快抵达目的地的捷径。

    尼采曾说:一切美好的事物都是曲折地接近自己的目标,一切笔直都是骗人的。业务有障碍,事业有起伏,人生有曲折,无论何时何地,我们都要不忘初衷。只有不忘记自己最初的想法,才会找对人生的方向,才会坚定我们的追求,才能有始有终地去完成自己的梦想。

    现在行动 为时未晚

    很多时候,我们会感慨,会抱怨,甚至会恨自己生不逢时。

    “怎么就没赶上市场好做的时候开始我的事业呢?”

    “现在才开始做公众号、知乎运营,晚了。”

    还是看看“最速曲线”图:

    96786b560eb454f05893eb6ab46a2dfb.gif

    四个颜色的小球在“最速曲线”的不同位置同时出发,却在同一时刻抵达终点。

    这说明,你差的越多,补的越快。

    两点间最短的距离不是线段,也不是直线。

    而是-------------曲线。

    展开全文
  • 就是最长的两点间最短距离。也就是说,对于某两个点i和j,它们间的最短距离最大。而这就是无向图的直径。【分析】 一开始我以为是二分,看到“最短距离最大”,我瞬间就想到了“最小值最大”。但是这是错误的思路。...
    无向树的直径,一个看似不起眼的东西,却牵涉到了许多的问题。
    【定义】
    什么是无向树的直径?就是最长的两点间最短距离。也就是说,对于某两个点i和j,它们间的最短距离最大。而这就是无向图的直径。
    【分析】
    一开始我以为是二分,看到“最短距离最大”,我瞬间就想到了“最小值最大”。但是这是错误的思路。
    【暴力1:BFS O(n^2+n*m)】
    首先,一种暴力的思路,以每个点当做其中的一个点i,用BFS来找到另一个点j,时间复杂度是O(n^2),但是常数很大,非常容易超时。
    【暴力2:枚举叶节点+LCA最短路 O(n*log2n+n^2*log2n)】
    但是,很显然的,i和j都必定是叶节点,不然的话,它们的孩子就会比它们拥有更大的相互距离。所以,我们只需要枚举所有的叶节点就可以了,非常简单。不过BFS的时间复杂度中常数的比例太高了,所以说我们不如直接用O(n^2)枚举,接着用LCA求最短的路径。合起来是O(n^2log2n),但是因为常数的关系,似乎和前面的暴力比起来还要略胜一筹。
    【补充:LCA求最短路 O(n*log2n)-O(log2n)】
    为什么LCA和最短路间有关系呢?因为对于节点(i,j),它们间的最短路径必然是(i-LCA(i,j))和(j-LCA(i,j))这两条路径的合并。也就是说,树上的最短路,必然是先到LCA再到另一个节点的。为什么呢?下面我们用一个很简单的方法证明,其他的路径不会比这条路径优(如果所有的路径都为正的话。如果有负路径的话,就要套用图的最短路了)。
    首先,考虑将LCA换为另一个节点u,而如果这个节点在LCA路径(即我们刚才说的那个先到LCA再到另一个节点)的话,那么路径显然是相同的。而如果不是呢?考虑节点u的深度比LCA要小的情况,那么肯定会多经过几条边,而且会有路径的重合,至于深度小的情况,也是一样的。如果深度一样呢?那就更不用讨论了,因为其他的节点都要绕道一个更高层的节点,肯定没有LCA路径更优。
    那么,这个路径长度有怎么求呢?考虑(i-LCA(i,j))这种路径,我们可以维护一个“树上前缀和”,或者说是树上每个节点的深度。这很容易求出来,只需要对于每个节点u,则其深度deepth(u)=deepth(father(u))+1。也就是说,每个节点的深度都是其父节点的深度加1。这样的话,就可以只用一次BFS就求出最终的结果了。
    【树形DP O(n)】
    但是,我们有更好的方法。那就是树形DP。什么是树形DP?首先考虑DP的性质,有一个“无后效性”。而属性就恰好满足这样的“无后效性”。比如说我们要从底向上的话,我们只需要将底层的先逐一DP,接着就可以用很容易的方法,转移上去了!在这里,每一棵子树都相当于一个子问题,接着由于没有环的性质,所以说当前的DP不会影响到之前的情况。因此,我们可以尝试这么一种DP的特殊方法。
    对于以每一个点作为根节点的子树,我们完全可以用一个DP求出离root最远的节点,比如说设f[root]就是指以root为根结点的子树的距离最远的节点,那么f[root]=maxlenpos{j,j是root的孩子节点}。那么,在这里我们要求的某两个节点的最长的最短距离的一对节点(i,j)呢?显然也是不难求的。如果要求对于某个root的i和j的话,只需要将i设为离root最远的节点,而j设为离root第二远的节点,然后就同样很容易推上去了。如果设为对于root的(i,j),为di[root]和dj[root],那么di[root]=biggestpos{j,j是root的孩子},dj[root]=secondbiggestpos{j,j是root的孩子}。最终的答案就是len(di[root],dj[root])(在这里root是整棵树的根节点)。那么这个路径的长度应该都可以直接通过LCA来求出来了。因为我们求出的biggestpos和secondbiggestpos就是第一大和第二大的下标,那么其和也显而易见的是最大的。注意,如果有多个最大值,则“第二大”的值也应该是最大值。总之,是在所有{f[j],j是root的孩子}中选择两个和最大的,这可以用一次线性的扫描就做到这一点。而每一个节点最多会被DP一次(DP的性质,再算一遍就浪费了,而由无后效性可知,不需要再算一遍,否则就不能用动态规划了),对孩子节点的扫描也最多只能够对每一个节点最多总共扫一遍,因为每一个节点最多是一个节点的孩子节点(就是它的父亲节点)。
    像这样的树形DP,相信肯定还会有一些大用处。下一次,当我们看到一个和树有关的图论问题时,我们就可以考虑用树形DP来解决。比如说树上的一些计数问题(选一系列的符合要求的节点,问选择的方案数量)、规划问题(选一系列的节点,满足某种要求且最优)。

    【带一些规约的两次BFS O(n+m+n+m)】
    前面说过,我们如果用普通的BFS的话,会有严重的效率问题。但是,我们也看到了另外一个突破口:设最终答案为(i,j),那么当我们知道i的时候,只需要一次BFS就可以知道j了。其的时间复杂度很低,仅仅是读入的规模。
    那么问题来了:我们该如何找到这么一个节点i呢?
    首先,我们可以做出一个很简单的证明,来证明一个命题:首先设整个点集为V,对于每一对的i,j∈V,不管是由哪一个节点u∈V作为根节点,这对i和j都必定是这棵树中的最长的相互最短距离点对。因为首先,这棵树是一棵无向树,而无向树是一种图,那么我们只从图的方向来出发,图中的两点间的最短路径,在没有相同费用边、负环和0费用的边,那么最短路径是唯一的。又因为在这里的边的长度都是1,那么显而易见的,命题成立(这个命题同时也是上面的树形DP的成立的基础)。
    接下来,我们再来一个命题:对于无向树中的任意一个节点,我们的(i,j)中距离较远的一个,比如说设点i是距离根节点较远的一个,那么i到根节点的距离同样也是最远的。我们的证明使用反证法:如果根节点距离i不是最远的,而是距离另外一个节点比如说i'是最远的,那么很显然(i',j)的长度比(i,j)要长。根据我们前面的结果,i和j必然是叶节点,而通过“精心安排”的根节点的位置,可以使得i和j的LCA就是根节点。而就算不是根节点,也是一样的道理。总而言之,可以很容易地看出LEN(i',j)>LEN(i,j)。所以,这和假设LEN(i,j)最大相悖。因此我们必定可以先选定任意一个节点,然后通过一次BFS找到i,再用一次BFS找到j。总体而言,还是非常之简单的。

    【最巧妙的方法:看似毫不相关的拓扑排序】
    考虑这样的一个过程:不断地删去这棵无向树的“叶节点“(这里的”叶节点“不是严格意义上的叶节点,而是指最外层的节点),然后最终的轮数*2就是这棵树的直径。也就是说,我们只需要一次拓扑排序,即可完成这个过程。我们只需要拓扑排序,即不断删去入度为1的点即可(因为再怎样,节点都有一个父节点,也就是至少都有一个出度)。但是这里要加一个“轮数”的概念,也就是说,同一张有向无环图,在不真正删点之前,所有入度为0的点都属于同一轮。删了之后,不断地再次寻找新的点,那么最终的直径就是轮数*2。
    这个代码的正确性给出以下的证明:首先考虑最后所剩下来的所谓“残渣”节点,因为我们的若干轮的删除,最后一轮的删除只可能删除这一个节点。因为树的树形结构,所以说最后一个入度为0的节点必定是这个。根据拓扑排序的思路,这个节点也是最后一个可能被访问的节点。那么,因为最后只剩下这么一个节点,而又通过我们的过程可以知道,以最后的这个节点为根,那么这个根到每一个叶节点的长度都是相等的。所以,又通过我们之前的证明,可以知道(i,j)必定都是叶节点。那么又通过我们现在,每一个叶节点的长度都相同的情况下,那么最终的答案就必然是删除的轮数(同时也是每一个叶节点到根节点的距离)。
    展开全文
  • 个相邻元素距离为 1 。 示例 1: 输入: 0 0 0 0 1 0 0 0 0 输出: 0 0 0 0 1 0 0 0 0 注意: 给定矩阵的元素个数不超过 10000。 给定矩阵中至少有一个元素是 0。 矩阵中的元素只在四个方向上相邻: 上、下、左、右...
  • 地球上两点间最短距离及计算方法

    万次阅读 2014-01-18 14:11:09
    地球上两点间最短距离及走法 一、为什么说“地球表面两地之间的最短距离是通过这两点的大圆的劣弧段”?                              如上左图所示:AB两点间最短距离是线段AB,即图...
  • // 相连的牧场 个牧场的距离 每个牧场到某距离 int conn[810][810],w[810][810],dis[810]; int num[810],size[810];//每个牧场的奶牛数 每个牧场有几个与它相连 int team[1688];//队列 int main() { ...
  • 欧氏距离

    2017-10-09 06:45:45
    欧式距离概念很简单,就是两点间的直线距离。该题最重要的就是知道,欧式距离的问题上,当这个点在这N个点中位数上的时候,距离最短。以下是我的代码: #include<iostream> #include<cstdlib> #include&...
  • 个位置距离,在自然环境中存在多条,而实际情况上,个位置的直线距离往往会成为首选。但是问题就出现在直线上,如何判断路径是条直线呢!在数学中,线面,连成线,线连成面,面连成立方。而立方连成会...
  • 陆品荣一、教学目标1、知识与技能:经历画图、观察和交流等活动,认识射线、直线及相互间的联系,能区分线段、射线、直线,了解两点确定一条直线,体会两点间所有连线中线段最短,知道两点间距离。问题解决与数学...
  • 认识两点间距离,知道两点间所有连线中线段最短。2.进一步认识角,掌握角的表示方法,角的读法,知道角的各部分名称。理解射线和角的关系。3.渗透事物之间相互联系和变化的观点。在活动中培养学生观察、...
  • #192-[LCA]距离查询

    2018-12-15 08:36:32
    FJ会给出一棵树,请求出两点间最短距离。 Input 第一行:n,m。n代表节点数量,m代表边的数量。 接下来m行,每行有u,v,dis和一个字符(E/S/W/N,分别为东南西北)。u代表这条边的起点,v为终点,dis则是这条边的...
  • 关于普通dij算法为什么不能解决负权边的分析

    千次阅读 多人点赞 2016-01-30 16:01:18
    首先找到距A最近的且直接相连的点(也就是两点间没有中转点)C,把C标记哈 找出C点的出点A,,B,A被标记了不管,此时A到B的距离为3,大于A到C的距离加上C到B的距离0,所以更新A到B的距离为0 更新后A到C的距离仍然为2...
  • 我当时想法很简单,只要圆相切,它们的半径之和一定最大,但是要保证不能相交的话就只能取两两个点间距离最短的作为半径和最大的。到现在也不是非常清楚为什么可以A,我们带错节奏了。。 #include #include #...
  • floyd算法就是用来求图中任意两点最短路径的,这里举一个例子,如何求下图中任意两点间最短路径呢?     我们用一个二维数组e[i] [j]来存储上面这个图所表示的意义。这里规定一个顶点到自己...
  • LCA+倍增浅析

    2018-01-21 21:24:41
    LCA多用于求树上两点间最短路径(即为不重复路径)上的权值和、最值问题。 为什么? 因为最短路径(不重复路径)说明了这条路径要经过它们的最近公共祖先,也可以理解为从它们的最近公共祖先出发分别
  • 迪杰斯特拉算法(图示+C语言实现)

    千次阅读 2019-08-16 22:52:06
    迪杰斯特拉是单源最短路算法(即只能求一点,到其他任一点的最短路径,但可以加循环得到任意两点间最短路径),无法处理带负权变的图 算法思路图示 初始化两个集合 S={A}(只包含源点,表示已经确定最短路径的节点,...
  • HDU 6393

    2018-09-18 21:01:36
    两点间最短路径。 分析:将环上一条边取出来,其余n-1条边可以结合LCA解最短路。询问时,比较通过取出的边和仅通过树上的边的路径的大小,最小值就是两点的最短路径。 树状数组差分维护点到根节点的距离,根据...
  • 最短路dijkstra,floyd

    2017-01-18 22:40:04
    两点之间的最小距离,dijkstra是计算某个点到其余点的最短路径,而floyd计算任意两点间最短路 感觉两个差不多,对于某两个点a,b之间 的距离,找到一个点c,比较原距离是否大于ac的距离加cb的距离之和,我感觉我还...
  • 仿iGoogle自定义首页模块...对于什么时候让虚线框移动到什么位置,IGoogle以前版本的处理是:找到取距离当前鼠标位置这点最近的可拖拽DIV(取最短两点间距离),然后让虚线框插入该DIV处。现在版本不清楚怎么做的。
  • 题解:因为两点间的直线一定比折线短,所以这样做 先使用所有点求得一个凸包,接着凸包每条边外移l长度,再在每相邻两条线间画一个半径为l的圆弧(想一想为什么) 因为凸包上每个点与平移后对应点相连会垂直于凸包...
  • 题意:给定一个树,求树上两点间最短距离 思路;tarjan求LCA,然后dist[v,u] = dist[v] + dist[u] - 2 * dist[LCA(v,u)] 总结:不知输入数据里的字母是什么鬼。。。 #include #include #include #...
  • 求仙人掌上两点间的最短路 题解 终于要构建圆方树啦 首先构建出圆方树,因为是仙人掌,和一般图可以稍微的不一样 直接\(tarjan\)缩点,对于每一个强连通分量构建方点(只有一个点的就不要建了) 圆方边的权值定义为...
  • 码农生涯杂记_5

    2017-06-27 18:34:00
    大概的意思能够理解为这样:“两点间最短距离是直线,可是最快从一点到达另一点,一定是两点间的最速曲线”。这是一个非常奇妙的曲线,事实上这些并非我想说的。最速曲线另一个特性。再曲线上不论什么点,在仅仅...
  • Flyod和Warshall

    2010-07-03 14:29:00
    Floyd算法用于求解任意两点间最短距离,准许两点间有负的权值,但是一般不准许出现负的环路,其算法复杂度为O(n3),相对于Dijkstra算法,其计算更为简单,但我自己重新复习的时候,觉得原理越简单,其实理解起来越...

空空如也

空空如也

1 2 3
收藏数 52
精华内容 20
关键字:

两点间距离什么最短