关于最小割建模正确性证明

来写一下对于最小割建模正确性的理解,困扰了好几天,今天算是看懂了。
前置知识:闭合子图,即一张图,图中边的终点也在该图中(可以选某点,但是不选它连接的边),其实就是割开一些边拿到一张闭合子图。
首先,明确一点,最初始的情况是只有点权,边代表关系$i \rightarrow j$表示选$i$必须选$j$如此云云。一般的套路就是:正权点和S相连,而负权点和T相连,容量均为点权绝对值,而原本的边照连,但是容量为INF。
其次:正确性证明,假设我们已经将$S$、$T$割开,并且$S$肯定是一张闭合子图(不然顺着某边biubiubiu就溜到$T$了),那么我们可以得到如下的一些关系式($C$是割,$W$是我们需要的价值,$S_+$、$S_-$表示目前$S$所在图中的正(负)权点之和,$T$同理):
$$sm = \sum_{i \in V, vak[i]>0} val[i]$$
$$C = T_{+} + \vert S_{-} \vert$$
$$W = S_{+} - \vert S_{-} \vert$$
$$C+W = S_{+} + T_{+} = sm$$
最后合并,发现$C+W=sm \rightarrow W=sm-C=sm-maxflow$,即我们想要的价值,是总的正权点和减去我们建出来图的最小割(即最大流),于是乎就可以解释为什么是上述所说一般套路的建图方式了。
一般来说,正权点就表示拿这个点可以得到收益,但是拿这个点必须拿一些别的点,此时必须拿的这些点会带来花费。
模板:线性代数我就是从这题理解的

原文地址:https://www.cnblogs.com/FormerAutumn/p/11254415.html

时间: 2024-10-26 22:34:52

关于最小割建模正确性证明的相关文章

【网络流】线性规划的最小割建模方式

前几天在师大附中听课,大概了解了一些关于网络流的建模方式,然后今天上午做了一些题目,在这里总结一下. 最小割的线性规划建模方式: 有一些0/1变量Xi,怎么怎么样之后会消耗某些代价或者获得某些利益,而最后的总收益可以写成如下的形式: min{ Σmax{Xi-Xj,0}*Wi } 其中Wi必须是正数. 那么假设源为1,汇为0,就将Xi连一条流量为Wi的边到Xj. 如果有形如1-Xi之类的形式就是从源向Xi连边,Xi-0这种形式就是Xi向汇点连边. 那么如果Wi是负数怎么办? 比如Xi*Wi(Wi

漫话最小割 part1

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "PingFang SC"; color: #454545 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px "Times New Roman"; color: #2d2d2d } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Ti

【bzoj4177】Mike的农场 网络流最小割

题目描述 Mike有一个农场,这个农场n个牲畜围栏,现在他想在每个牲畜围栏中养一只动物,每只动物可以是牛或羊,并且每个牲畜围栏中的饲养条件都不同,其中第i个牲畜围栏中的动物长大后,每只牛可以卖a[i]元,每只羊可以卖b[i]元,为了防止牛羊之间相互影响,Mike找到了m条规律,每条规律给出一个三元组(i, j, k)表示如果第i个围栏和第j个围栏养的是不同的动物,那么Mike就需要花费k的代价请人帮忙处理牛羊之间的影响.不过同时Mike也发现k条特殊的规则(S, a, b),表示如果S中所有牲畜

2019 HDU 多校赛第二场 HDU 6598 Harmonious Army 构造最小割模型

题意: 有n个士兵,你可以选择让它成为战士还是法师. 有m对关系,u和v 如果同时为战士那么你可以获得a的权值 如果同时为法师,你可以获得c的权值, 如果一个为战士一个是法师,你可以获得b的权值 问你可以获得的最大权值是多少? 题解: 对每个士兵建立一个点x ,点x 向源点s 连一条边,向汇点t 连一条边, 分别表示选择两种职业,然后就可以先加上所有的贡献,通过两点关系用 最小割建模,如下图所示 设一条边的三种贡献为A, B, C,可以得到以下方程: 如果x,y都是法师,你可以获得C的权值,但是

POJ 3084 Panic Room 求最小割

建模的思路大概是这样的,把房间当做点,门当做是边,如果从房间A能到房间B中间有一个门,如果锁在A这边那么A->B容量就是INF,B->A的容量就是1. 攻击者如果在A这边的话显然就算你锁了门也是没有意义的,在B这边如果锁上是有意义的,所以算1个门,然后就很简单了,建立源点到所有攻击者点的边,容量为INF,汇点就是要保护的那个房间.求最小割即可. #include <cstdio> #include <cstring> #include <cmath> #in

POJ3308 Paratroopers(最小割/最小点权覆盖)

把入侵者看作边,每一行每一列都是点,选取某一行某一列都有费用,这样问题就是选总权最小的点集覆盖所有边,就是最小点权覆盖. 此外,题目的总花费是所有费用的乘积,这时有个技巧,就是取对数,把乘法变为加法运算,最后再还原. 另外还可以从最小割的思路去这么理解: 每一行与源点相连,容量为该行的花费:每一列与汇点相连,容量为该列的花费:对于每个入侵者的坐标,该行该列连接一条容量INF的边. 要让源点汇点不连通,割边集必然与所有入侵者的行或列相关,而这样建模后的最小割就是最小的花费(容量INF的边必然不是最

最小割模型在信息学竞赛中的应用___读后的收获

在看了Amber的<最小割模型在信息学竞赛中的应用>后感觉到了自己的智障-- 我还是按照目录来,其实第一个子目录中我收获最大的还是01分数规划的内容. 01分数规划:给定n个条件,在其中选取一些条件,使得要求的目标函数达到最值. 通俗一点说:给定两个数组,a[i]表示选取i的收益,b[i]表示选取i的代价.如果选取i,定义x[i]=1否则x[i]=0.每一个物品只有选或者不选两种方案,求一个选择方案使得R=sigma(a[i]*x[i])/sigma(b[i]*x[i])取得最值,即所有选择物

734. [网络流24题] 方格取数问题 二分图点权最大独立集/最小割/最大流

?问题描述:在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.?编程任务:对于给定的方格棋盘,按照取数要求编程找出总和最大的数.?数据输入:由文件grid.in提供输入数据.文件第1 行有2 个正整数m和n,分别表示棋盘的行数和列数.接下来的m行,每行有n个正整数,表示棋盘方格中的数. [问题分析] 二分图点权最大独立集,转化为最小割模型,从而用最大流解决. [建模方法] 首先把棋盘黑白

最小割 专题练习

最小割的建模技巧 技巧0. INF 的使用 (u, v, INF) . 这条边不能割, u 和 v 的状态必须一样. 技巧1. 核心模型 若 x, y 不同, 则减少 v . 连双向边 (x, y, v) . 技巧2. 统治点 x 与集合 A 中一个不同, 则减少 v . a[1] / v / x <------> A ---- a[2] \ \ a[3] 技巧3. 最大 - 最小转化 假装把所有都给取了, 这样条件会取反. 技巧4. A 中的都一样. 建立与 S 一定相连的点 v1, 即 (