ctsc2009 移民站选址

 

分析:非常非常好的一道题!

首先需要对问题进行转化:

  1. 行列无关,对于行单独处理,对于列单独处理
  2. 必然存在一个最优方案使得每一个新站与旧站重合.

转化1很显然,对于转化2,是一类非常经典的“中位数问题”,即在一条线段上,有若干个特殊点,要选择一个点的位置,使得它到这些点距离*对应权值的和最小. 结论就是这个点一定在给定的这些点的位置上.

那么问题可以变成,m个位置,每个有n种选择,代价即为其与旧站的传输代价和。不同位置间的选择也会带来代价.

首先假设我们不知道这道题要用网络流来做. dp? Emm,这怎么设计状态啊,要状压吗? 明显压不下. 贪心,肯定不行. 这道题涉及到“匹配”,自然就是网络流咯.

费用流可以吗?显然是不行的,旧站与新站之间的费用很好处理,但是新站与新站之间的费用不好处理.

那就只有是最大流咯. 用流量表示费用?这怎么表示啊......

那么锁定方法--最小割!

每个位置有多种选择,注意到这句话,可以往两个方面去想:

  1. 把选择看作点.
  2. 将每个位置拆成选择个数个点.

本题如果要用最小割显然不能用第一种方法.因为选择与选择之间不好处理,那么就用第二种方法.

上面所画的就是建图方式.具体说来,就是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不连通,一次能够割掉很多条边.如果网络流的题要求很多的贡献(两两之间的).尝试用最小割?

posted @ 2018-03-20 21:47  zbtrs  阅读(299)  评论(0编辑  收藏  举报