zoukankan      html  css  js  c++  java
  • P1744 采购特价商品

    原题链接 https://www.luogu.org/problemnew/show/P1744

    一道最短路的模板题.....很简单吧

    求最短路的方法有很多,但是对于刚学完Floyd的我,只会用这个.......虽然有点慢,但是也能AC

    Floyd算法

    1.定义概览

    Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。Floyd-Warshall算法的时间复杂度为O(N3),空间复杂度为O(N2)。

    2.算法描述

    算法思想原理:

         Floyd算法是一个经典的动态规划算法。用通俗的语言来描述的话,首先我们的目标是寻找从点i到点j的最短路径。从动态规划的角度看问题,我们需要为这个目标重新做一个诠释(这个诠释正是动态规划最富创造力的精华所在)

          从任意节点i到任意节点j的最短路径不外乎2种可能,1是直接从i到j,2是从i经过若干个节点k到j。所以,我们假设Dis(i,j)为节点u到节点v的最短路径的距离,对于每一个节点k,我们检查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,如果成立,证明从i到k再到j的路径比i直接到j的路径短,我们便设置Dis(i,j) = Dis(i,k) + Dis(k,j),这样一来,当我们遍历完所有节点k,Dis(i,j)中记录的便是i到j的最短路径的距离。

    我们可以开一个n*n的邻接矩阵,记录联通情况:f[i][j]如果为1,则说明i到j联通;如果为∞,则说明不连通(之所以用∞的原因是比较的时候无穷大一定比任何除无穷大以外的数的和都大,这样就不会把∞算进去),然后可以进一步将f[i][j]=1的地方利用两点间距离公式将1换成具体的距离

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    using namespace std;
    int n,m,x,y,a[101][2],aa,bb;         //a数组存放坐标 
    double b[101][101];                  //b数组存放最短路,注意double类型 
    int main()
    {
        cin>>n;                          //n个点 
        for(int i=1;i<=n;i++)
        cin>>a[i][0]>>a[i][1];           //横纵坐标 
        cin>>m;                          //m处联通 
        memset(b,0x7f,sizeof(b));        //先将全部的元素赋为无穷大 
        for(int i=1;i<=m;i++)
        {
            cin>>x>>y;                   //点x与点y是联通的       
            b[x][y]=b[y][x]=sqrt(pow((double)(a[x][0]-a[y][0]),2)+pow((double)(a[x][1]-a[y][1]),2));
            //利用邻接矩阵的对称性减少一半运算,两点间距离公式算距离,注意改成double类型 
        }
        for(int k=1;k<=n;k++)            //Floyd算法,O(n^3)复杂度 
           for(int i=1;i<=n;i++)
              for(int j=1;j<=n;j++)
                 if(i!=j&&i!=k&&j!=k&&((b[i][k]+b[k][j])<b[i][j])) b[i][j]=b[i][k]+b[k][j];
                 //如果第i点和第j点间有个间接点k使得第i个点到第k个点的距离+k个点到第j个点的距离<小于第i个点到第j个点的直接距离,则将最短距离更新 
        cin>>aa>>bb;                     //题目要求的第aa个点到第bb个点的矩阵 
        printf("%.2lf",b[aa][bb]);       //直接输出 
        return 0;
    }

    完结撒花qaq~

  • 相关阅读:
    一个丰富的通知工具类 --第三方开源--NotifyUtil
    RecycleView出现折叠效果--第三方开源--SectionedExpandableGridRecyclerView
    Socket TCP连接相互通信
    InputStream与String,Byte之间互转
    socket调试工具
    可直接导入studio的 android-Ultra-Pull-To-Refresh-master
    纯手写验证码MVC中
    Upload图片-单张
    C#、SQL中的事务
    MVC、控件、一般处理程序中的session and cookie
  • 原文地址:https://www.cnblogs.com/xcg123/p/10744131.html
Copyright © 2011-2022 走看看