这道题首先要明确一点,那就是当你从一个点走到自己时,也是需要花费这个点点权值的费用。这个点卡了我两次QWQ
然后我比较喜欢分两步搞:
首先,我们利用floyd的一个性质:就是在更新其他点之间的路线时要先引入一个点,而枚举是按编号
再来看这道题,如果它不要求加点权,那么就是裸的floyd,所以这道题难点就在于如何确定一条路径上最大的点,这时就容易让人想到这道题有一个排序步骤,因为排完序后在每一位都可以确定它前面的点都比它大/小。
好了,那么显然是在枚举的时候,如果我们把小的点先枚举,大的点后枚举,不就能保证之前更新的值都小于这个值(也就是说路径上的值最大为这个枚举点)了吗^_^
所以
考虑用f[i][j]来表示以i,j为两端的最短路,不过值得注意的是,这条路径上没有比i,j,k点权更大的点
考虑用dp[i][j]来表示答案,也就是以i,j为两端,路径上比较大的点权+总边权
所以转移方程就是:
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
dp[i][j]=min(dp[i][j],f[i][j]+max(a[i],a[j],a[k]);