分析:非常非常好的一道题!
首先需要对问题进行转化:
- 行列无关,对于行单独处理,对于列单独处理
- 必然存在一个最优方案使得每一个新站与旧站重合.
转化1很显然,对于转化2,是一类非常经典的“中位数问题”,即在一条线段上,有若干个特殊点,要选择一个点的位置,使得它到这些点距离*对应权值的和最小. 结论就是这个点一定在给定的这些点的位置上.
那么问题可以变成,m个位置,每个有n种选择,代价即为其与旧站的传输代价和。不同位置间的选择也会带来代价.
首先假设我们不知道这道题要用网络流来做. dp? Emm,这怎么设计状态啊,要状压吗? 明显压不下. 贪心,肯定不行. 这道题涉及到“匹配”,自然就是网络流咯.
费用流可以吗?显然是不行的,旧站与新站之间的费用很好处理,但是新站与新站之间的费用不好处理.
那就只有是最大流咯. 用流量表示费用?这怎么表示啊......
那么锁定方法--最小割!
每个位置有多种选择,注意到这句话,可以往两个方面去想:
- 把选择看作点.
- 将每个位置拆成选择个数个点.
本题如果要用最小割显然不能用第一种方法.因为选择与选择之间不好处理,那么就用第二种方法.
上面所画的就是建图方式.具体说来,就是S连向每个点拆出来的第一个点,容量为inf,每个点拆出来的最后一个点连向T,容量为inf.
对于第i个点拆出的第k个点连向第i个点拆出的第k+1个点,容量为第i个新站建在第k个旧站的代价.
对于第i个点拆出的第k个点连向第j个点拆出的第k个点,容量为b_ij.
下面来分析一下建图:
割掉第i个点拆出来的点实际上就是确定了第i个新站的位置. 如上图所示,如果同时割掉两条红色的边,为了使得S,T不连通,必然会割掉两条绿色的边. 如果i的选择是pi,j的选择是pj,一共会割掉 |pi - pj|条绿边,正好就是新站i,j之间的代价.
至此这道题就做完了.
一点感想:最小割为了使得ST不连通,一次能够割掉很多条边.如果网络流的题要求很多的贡献(两两之间的).尝试用最小割?