租用游艇(最短路径模板)
题目
题目描述
长江游艇俱乐部在长江上设置了 $ 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了,但是我们还是要把它优化一下。