租用游艇(最短路径模板)

题目

这里是题目链接:租用游艇

题目描述

长江游艇俱乐部在长江上设置了 $ n $ 个游艇出租站 $ 1,2,⋯ ,n $ 。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站 $ i $ 到游艇出租站 $ j $ 之间的租金为 $ r(i,j) $ ( $ 1≤i<j≤n $ )。试设计一个算法,计算出从游艇出租站 $ 1 $ 到游艇出租站 $ n $ 所需的最少租金。

输入格式

第一行中有一个正整数 $ n $,表示有 $ n $ 个游艇出租站。接下来的 $ n−1 $ 行是一个半矩阵 $ r(i,j)(1≤i<j≤n)$ 。

输出格式

输出计算出的从游艇出租站 $ 1 $ 到游艇出租站 $ n $ 所需的最少租金。

说明/提示

$ n≤200 $ ,保证计算过程中任何时刻数值都不超过 $ 10^6 $ 。

算法分析

这道题目就是一个简单的最短路径。

现在先来看看最暴力的算法 $ Floyd $,它来了,它来了...:

因为这个算法过于暴力,所以不用怎么说大家都会,直接就上核心代码吧,

  for(int k = 1;k <= n;k ++)          //k为中转站,枚举以k为中转站的边是否能松弛
    for(int i = 1;i <=n;i ++)
      for(int j = 1;j <= n;j ++)
          if(dis[i][j] > dis[i][k] + dis[k][j])
                dis[i][j] = dis[i][k] + dis[k][j];  

看看这个代码,应该也不用多说吧。
时间复杂度为: $ o(n^3) $,虽然这道题的数据范围已经足够AC了,但是我们还是要把它优化一下。

下面我们要来看看,$ Dijkstra $ 的思路,其中部分图片是粘贴别人的博客的:

posted @ 2021-03-13 16:53  在那遥远的悠穹下  阅读(90)  评论(0编辑  收藏  举报