旅行
题目大意
Long long ago,there was a kingdom called HJY. HJY有n个城市,从1到n进行编号。HJY有m条道路,第i条道路连接着两个城市ai,bi,由于年代久远,所有的道路都已经不能使用。如果要修复第i条道路,需要wi的时间。现在黄国王想要将某些道路修复,使得1号城市能够到达n号城市,2号城市能够到达n-1号城市..k号城市能够到达n-k+1号城市。为了满足黄国王的要求,请问最少需要多少时间去修复道路。如果无法做到,黄国王会很生气,他会让你输出10!。
输入格式
第一行:n,m,k
接下来m行:ai,bi,wi
含义如上所述。
输出格式
输出共一行:最少需要多少时间修复道路。如果始终无法满足旅者的要求,请输出10!。
样例输入
5 5 2
1 3 4
3 5 2
2 3 1
3 4 4
2 4 3
样例输出
9
数据范围
20%的数据满足:k <= 2, n<= 10, m <= 20
40%的数据满足:k <= 3, n<=100, m<=1000
70%的数据满足:k<=4, n<=1000, m<=1000
100%的数据满足:k<=4, n<=10000, m<=10000, n >= 2*k, wi<= 1000, 1 <= ai, bi <= n
正解
看到k<=4,这是个很小的数。
我们设一个状态转移方程
F
[
转移很明显,如果
F[i][s]=min(F[i][S],F[j][S']+F[i][S-S']+v);
S′
是属于
S
的一个集合,以上比较容易理解。
现在我们关注到如果
(
F
[
可以打一个SPFA完成上述操作。
剩下的就简单,令good[
注意,如果在
最后就是要将这些状态组合起来,使得他们的权值和最小。我们可以再用一个DP解决。