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

旅行

题目大意

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 的一个集合,以上比较容易理解。
现在我们关注到如果i j 相连边,他两之间的距离为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解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值