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 的连边就是正常的走动。

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

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

你可能感兴趣的:(网络流,随笔,网络流)