1706: [usaco2007 Nov]relays 奶牛接力跑

令f[q][x][y] 表示x 到 y点经过了2^q个跑道的最小花费,那么把n二进制拆分,

令g[i][j]表示i到j的最小花费,对于n&(1<<q)的部分直接将f[q]加入g中,因为一定从g和f中各挑一半,那么用临时数组h来存储当前答案,最后把再把h重新赋给g。

同时注意点的编号 <= 1000,直接开是要爆的,观察边t <= 100,即点最多有200个,那么离散化处理就好了。

搞定。

c++代码如下:

 

9 + 4 =