题意
B市可以由一个 n n n 个点 m m m 条边的带权无向图来描述。其中边 e e e 的边权为 w e w_e we。小A要从编号为 1 1 1 的地方走到编号为 n n n 的地方。对于一条选定的路径 P P P,小A要花的时间就是这条路径经过的边的总长度。问小A最少需要多少时间才能到?
当小A还在深思这个问题,担心自己不能准时到达的时候,一位长者来到他的面前。他可以用魔法,帮助小A减少他所需的时间。具体而言,对于一条路径 p = { e 1 , e 2 , ⋯ , e c } p=\{e_1,e_2,\cdots,e_c\} p={e1,e2,⋯,ec},小A最终需要的时间是中的前 K K K 大的和。假如 c < K c<K c<K,则是这些边的总和。
当然小A是需要付出代价的,不同的 K K K,他需要 w e 1 , w e 2 , ⋯ , w e c w_{e_1},w_{e_2},\cdots,w_{e_c} we1,we2,⋯,wec 付出不同的代价。因此小A想知道当 K K K 分别取 1 ⋯ n 1 \cdots n 1⋯n的时候,他的最小时间耗费分别是多少。
对于 30% 的数据, n , m ≤ 15 n,m \le 15 n,m≤15
对于 60% 的数据, n , m ≤ 300 n,m \le 300 n,m≤300
对于的 100% 数据 , n , m ≤ 3000 , 1 ≤ u i , v i ≤ 1 0 9 n,m \le 3000, 1 \le u_i,v_i \le 10^9 n,m≤3000,1≤ui,vi≤109,保证 1 1 1 与 n n n 连通。
题解
考场上的想法是枚举第k大的边(权值为w),然后做一个DP,
f
[
i
]
[
j
]
f[i][j]
f[i][j]为到i经过j条权值>w的边(其它的看作0),跑最短路后去更新答案,效率
O
(
m
n
2
l
o
g
n
)
O(mn^2logn)
O(mn2logn)。
考虑优化,注意到枚举边这一步是必要的(考场上一直想优化这步就自闭了)。于是考虑减少DP状态,那就不能记走了多少条有权值的边。那对于不同的k该怎么处理呢?只能拿着一条最短路去更新所有k,必须对原图的边权有所改变:考虑对于一条权值>w的边,先少加一个w,这样更新一个k的时候再加上kw,由于kw只和k有关,保证原图的最短路可以贡献给每个k,就是正确的,效率
O
(
m
n
l
o
g
n
)
O(mnlogn)
O(mnlogn)。