码迷,mamicode.com
首页 > 其他好文 > 详细

最小割的理解和应用

时间:2018-05-15 00:29:28      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:学习   常用   集合问题   class   连通   noi   应用   网络流   关于   

博主比较菜QwQ,一直学不会最小割,全靠背板子背模型来做(chao)题(jie)。
省选和CTSC打完(beng)了,于是对以前学的网络流的最小割算法进行一些简单的总结。

最小割

本文讨论的最小割都是源汇最小割,关于全局最小割请自行学习。源汇最小割,简单来讲就是切去一些边使得源汇不连通,并使得删去的边权权值最小。
常用的方法是跑一遍最大流,关于为什么最大流等于最小割会在随后给出。

集合划分

因为源汇最小割即就是将源汇划分到不同的集合,那么最简单的应用大概就是最小代价划分集合了。本文用\(S\)表示网络流图中的源点,用\(T\)表示网络流图中的汇点。

我们尝试定义一下这个限制:有\(n\)个变量\(x_i\),取值为\(\{0,1\}\),要最小化函数\(z=\sum_{i=1}^n{w_ix_i}\),那么就可以很形象地用最小割模型描述这个约束:对于一个点\(i\)\(x_i\)\(1\)表示\(i\)\(S\)同属一个集合,即割去\(i\)\(T\)之间的边,代价是\(w_i\)

但在实际上如果令一个点与\(T\)同属一个集合,同样会删去一些边,产生权值。为了描述这些情况,我们构造一种使得当\(x_i=0\)时产生代价的限制。这个可以很显然地构造出:\((1-x_i)w_i\)

那么对于这一类划分集合问题,我们可以建出最小割模型:

每一个点能且仅能被划分到两个集合中的一个集合。其中划分到第一个集合代价为\(a_i\),划分到第二个集合代价为\(b_i\),求最小划分代价。

我们可以很方便地列出这类问题的约束函数:
\[ z=\sum_{i=1}^n{a_ix_i+b_i(1-x_i)} \]
然后很轻松地按定义建图:对于一点\(i\):

  1. \(S\)\(i\)\(b_i\)的边
  2. \(i\)\(T\)\(a_i\)的边

此时最小割就是最小代价。

然而即使是连noip普及组都拿不上奖的博主都能发现:这难道不是直接贪心。。。

但最小割不仅能够解决简单的集合划分,还能解决带某些约束的集合划分。

比如在原题上加一些条件:

给定一些约束\(i,j\),当\(i,j\)被划分到不同集合,那么会产生额外的代价c_{i,j}

就无法直接贪心了= =

我们先列出约束函数:\(z=\sum_{i,j}{c_{i,j}max(0,x_i-x_j)+c_{i,j}max(0,x_j-x_i)}\)

拆出来考虑\(c_{i,j}max(0,x_i-x_j)\),也能感性的构造出一种构图方式:当且仅当\(i\)属于\(S\)\(j\)属于\(T\)时产生权值,此时从\(i\)\(j\)连权值为\(c_{i,j}\)的边,当\(i\)属于\(S\)\(j\)属于\(T\)时必须割掉这条边才能完成集合划分。

这一类问题就被我们很好的解决了。

此时我们再考虑一类问题,若要求最大的集合划分呢?

思路很显然,对答案贡献改为负权即可,但这样又不符合最小割模型的约定,所以这里要做一些改动。当\(w_i<0\)时:
\[ w_ix_i=(-w_i)(-x_i)=w_i+(-w_i)(1-x_i) \]

最后取答案的绝对值就是我们想要的答案。

最大权闭合子图

简单来说就是一类依赖问题:

\(i\)选则\(j\)必选,或是若\(i\)不选则\(j\)必不选。

我们可以尝试构造约束函数:\(z=\sum_{i,j}{\infty x_i(1-x_j)}\) 以及 \(z=\sum_{i,j}{\infty(1-x_i)x_j}\)

然后按照集合划分那部分的连边方法连边即可。

其他的一些约束

互不共存问题:

\(i\)\(j\)不能同时存在

\(z=\infty x_ix_j\)

构造变量\(y_i\),使得对于约束\(i,j\)\(x_i,y_j\)必须共存,\(y_i\)代价与\(1-x_i\)相同。这样只要\(x_i,y_i\)不共存,则就能保证正确性。而因为\(x_i,y_i\)连边是二分图,必然保证不共存。最终答案除以二即可

当若干点同属某个集合时有额外贡献。求最大代价。

为了简单描述,认为若干点只有两个,是\(i,j\)。即求\(z=wx_ix_j=w+(-w)(1-x_ix_j)\)

\(y=x_ix_j\),则有:
\[ z=w+(-w)y+\infty |y-x_i|+\infty |y-x_j| \]

正常连边即可。绝对值即连双向边。

本文只是简单介绍了一些常见情况,仅用以抛砖引玉。

例题以后再补。。。

最小割的理解和应用

标签:学习   常用   集合问题   class   连通   noi   应用   网络流   关于   

原文地址:https://www.cnblogs.com/erro/p/9038615.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!