最小割的理解和应用

博主比较菜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| \]

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

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

例题以后再补。。。

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

时间: 2024-11-17 14:56:43

最小割的理解和应用的相关文章

HDU 2435 There is a war (网络流-最小割)

There is a war Problem Description There is a sea. There are N islands in the sea. There are some directional bridges connecting these islands. There is a country called Country One located in Island 1. There is another country called Country Another

POJ 2125 --Destroying The Graph【最小割解决 &quot;最小点权覆盖问题&quot; &amp;&amp; 输出解(割边集) &amp;&amp; 各种不懂】

Destroying The Graph Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7597   Accepted: 2434   Special Judge Description Alice and Bob play the following game. First, Alice draws some directed graph with N vertices and M arcs. After that B

HDU_3313_Key_Vertex(最小割)

题意:已给有向图,给定起点和终点S,T,问图中有多少个点去掉可以使S T不可达 思路: 按常规思路就是找一条最短路,最短路之外的所有点不符合条件,然后在最短路上搞搞就好了 为了加深一下最小割的理解就用最小割写了此题 拆点,拆点之间连容量为1的边,有向边连inf的边,最大流一下,显然关键点的拆点间的流是满流而且必须是最小割. 然后就从满流+最小割这两点判断就可以辣,若u -> v 不是最小割,那么残余网络上S必然可达v,所以在残余网络上bfsS的可达点. /* ******************

关于最小割的进一步理解

以前只知道最小割就是最大流...网络流背个模板,没了 根本没有深入理解,最近写了一些题才知道自己很 $naive$ 废话不多说,开始正题(假设大家都会网络流的代码,并且知道网络流在做什么) 首先最小割就是最大流(废话) 一条图的最小割中,一定有一些边,它们是满流的(如果不满流就不是最大流了) 不妨把这些边称作割边,显然,这些割边把图分成两个部分,一个与源点 $S$ 在同一个部分,一个与汇点 $T$在同一个部分 放图理解: 首先原图长这样: 然后一种最小割长这样(红色的是满流的边): 我们把与 $

There is a war (hdu 2435 最小割+枚举)

There is a war Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 970    Accepted Submission(s): 277 Problem Description There is a sea. There are N islands in the sea. There are some directional

【BZOJ3232】圈地游戏 分数规划+最小割

[BZOJ3232]圈地游戏 Description DZY家的后院有一块地,由N行M列的方格组成,格子内种的菜有一定的价值,并且每一条单位长度的格线有一定的费用. DZY喜欢在地里散步.他总是从任意一个格点出发,沿着格线行走直到回到出发点,且在行走途中不允许与已走过的路线有任何相交或触碰(出发点除外).记这条封闭路线内部的格子总价值为V,路线上的费用总和为C,DZY想知道V/C的最大值是多少. Input 第一行为两个正整数n,m. 接下来n行,每行m个非负整数,表示对应格子的价值. 接下来n

hdu 3204(最小割--关键割边)

Ikki's Story I - Road Reconstruction Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 7491   Accepted: 2172 Description Ikki is the king of a small country – Phoenix, Phoenix is so small that there is only one city that is responsible fo

hdoj 3820 Golden Eggs 【双二分图构造最小割模型】

Golden Eggs Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 505    Accepted Submission(s): 284 Problem Description There is a grid with N rows and M columns. In each cell you can choose to put

zoj2587 Unique Attack 判断最小割是否唯一

题目链接: zoj2587 题意: 给出一张无向网络图,并给出起点和终点,破坏图的每一条边需要一定的费用,问破坏起点和终点的连通性的费用是否唯一. 解题思路: 破坏两点的连通性的最小费用,很容易联想到 网络流中的最小割, 建立源点 汇点 同时 因为图是无向图,我们需要将每条边建两次(正反向). 然后就是判断这个最小割是否唯一了: 首先 从源点开始 dfs  通过非饱和边  统计所有能走到的点  记为s1 然后 从汇点开始 dfs  通过非饱和边  统计所有能走到的点 记为s2 如果s1+s2==