JZOJ.3400【GDOI2014模拟】旅行 解题报告

来源:互联网 发布:win7卸载ubuntu双系统 编辑:程序博客网 时间:2024/05/16 15:19

旅行

题目大意

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[i][S],表示从图中选出了一颗以i为根节点的树,用二进制数S表示这待连接2k的点是否在这棵树中的状态,1表示在这棵树,为0则不在,此时组成这棵树的最小权之和为F[i][S]。
转移很明显,如果j是一个和点i相连的点,且他两之间的距离为v

F[i][s]=min(F[i][S],F[j][S']+F[i][S-S']+v);

S是属于S的一个集合,以上比较容易理解。
现在我们关注到如果ij相连边,他两之间的距离为v,则
F[i][S]+v)可以更新F[j][S],同理(F[j][S]+v)也可以更新F[i][S]。
可以打一个SPFA完成上述操作。
剩下的就简单,令good[S]=min(F[i][S])。则我们知道了将S状态联通所需要的最小代价。
注意,如果在S状态中,存在一个i,而不存在n-i+1,那么我们将这个状态删除。
最后就是要将这些状态组合起来,使得他们的权值和最小。我们可以再用一个DP解决。

3 0