bzoj2324拯救皮卡丘

说实话,我是没有想到用费用流来求解的。
这道题,出看时,以为是DP。但是后来发现更本设不了状态,也转移不了。然后想了很久,只是发现了一些毫无意义的性质。
1.如果在每一个点,最多只有一个点会在上面(除了0号节点)
2.一个点走的必定是一段连续的路。这不显然吗?
3.每次走到一个点,一定走关于到这个点的最短路,且不能走没有扩展的点。

通过性质2,我们可以发现其实原问题就是选不超过k条链(可能链比较鬼畜)出来,覆盖整个图,且保证总长度最短。
通过性质3,我们可以先预处理 floyd dis[i][j] 表示只经过 k<=i | k<=j 的点转移得到的最短路。

依照最小路径覆盖的方法。所以,考虑费用流建图:
1. S 0 (k,0) 的边。
2. S i (1,0) 的边。
3. T i+n (1,0) 的边。
4. i j+n 且满足 (j>i) (inf,dis[i][j]) 的边。
为什么这么连呢?

.由性质1,由于每个点都可能是该路径的终点,所以每个点都向 T 连边。
如果i+n>T的边满流,且它不是中转点,那怎么办?于是就有了 S 连过来填补那部分缺失的流量,即只有S>i不满流,而 i+n>T 满流的点是路径的终点(起点都是 0 )。而i j+n 的连边就是正常的走动。

于是最后的最小费用最大流就是答案。

代码。。。自己写吧!反正又不难。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值