USACO 2009 Dec cow toll paths 过路费-floyd

这道题首先要明确一点,那就是当你从一个点走到自己时,也是需要花费这个点点权值的费用。这个点卡了我两次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]);

最后处理一下映射细节就好了

posted @ 2018-07-27 13:15  Unstoppable728  阅读(137)  评论(0编辑  收藏  举报