转载请注明原文连接:http://www.cnblogs.com/LadyLex/p/7601119.html html
彷佛本身以前整理过一点点网络流的东西网络
可是最近看了几道题目以后发现本身仍是太菜了数据结构
那么让咱们继续整理吧!下面是我目前所学,不按期更新!ide
若是对于点有必定的限制,或者咱们的问题中还涉及了时间,函数
咱们能够考虑拆点来解决,好比某个点的通过次数,或者时间的分层图,学习
或者把1个点拆成n个,用最小割来表示选择……均可以经过拆点连边来表示限制条件.优化
精度要求不高的实数流能够经过放缩的方式计算,即乘以大倍率再除去idea
见到棋盘先来一套黑白染色冷静一下就行了spa
棋盘题千万不要忘记黑白染色!code
彷佛2-sat也能够这么玩
举个最简单的例子:若是咱们的边是对某个区间里面的每一个点都要联边,
咱们就能够建个线段树,向对应区间联边,线段树节点之间再联边,
这样就可让边数从$n^{2}$变成$nlogn$
彷佛2-sat也能够这么玩
在某些状况下,可能一系列元素中只能选取一个
那在2-sat里面,点从“x为真/假”变成了“前x个为真/假”
网络流里面也能够相似进行操做,
咱们就不用从这个点向每一个点都联边了,一串inf连下去便可
这个多见于最小割/最大权闭合子图中
咱们的inf边能够表明“二者只能选择一个”,即割掉二者中的一个,
或者“选择a必须选择b”,而后用到最大权闭合子图里面
若是对于某条边,其费用是关于流量的一个函数,而且知足他斜率是单调增长的,咱们就能够拆边,第x条费用设为$f(x)-f(x-1)$
这样因为咱们跑最小费用,每次就会找最小的,流了x时就能正好计算了对应的f(x)
彷佛一个不错的建模方法是先建个暴力图,而后看看能不能减小其中的点来优化咱们的图
规律1. 若是几个结点的流量的来源彻底相同,则能够把它们合并成一个。
规律2. 若是几个结点的流量的去向彻底相同,则能够把它们合并成一个。
规律3. 若是从点u到点v有一条容量为∞的边,而且点v除了点u之外没有别的流量来源,则能够把这两个结点合并成一个。
这个……我不是很会
平面图的最小割就对应了对偶图的最短路
转对偶通常使用对象仍是网格图,或者有特殊结构的图(看题),
总之要求能够很容易的给每一个联通块编号,而且能用什么东西表明它
一开始我觉得这东西就是个狼抓兔子
最后发现事情不太对……平面图转对偶图不只仅这么简单
因为最短路的复杂度通常是比网络流优秀的
因此……若是一张图能够转对偶,原来的解法边点又不少,那么咱们不妨试试转对偶
??????
不会!留坑待填!
这种题以前见过两道,都是很是裸的那种
通常都是说“要用回路覆盖整个网络”,而后咱们限制每一个点度数必须为2
但是……今天见了个新题
若是每一个点能够选进回路能够不选,每种连边方式有权值,而后要求最大权呢?
怎么感受这两个都这么像插头DP啊23333
考虑使用费用流,咱们固然先黑白染色
而后……咱们能够把回路原来的边肯定一个方向,好比说纵向边必须黑连白,横向必须白连黑
这样咱们把每一个点拆为2点x1和x2,连$S-->x1-->x2-->T$,流量为1费用为0
这条x1-->x2的边表明不选
而后咱们把原图中有向边对应的x1连向y2,流量1,费用为对应费用
这样若是有一个x1-->y2被流了,x2和y1就都须要另一个来流它
因为咱们跑的费用流的前提是最大流,所以这样咱们求出来的解不会存在某个点度数不合法的状况
这样非常妙啊……考场上没有想到拆点处理
bzoj1711 bzoj1458 bzoj3993
bzoj2095最大流求混合图欧拉回路
这个问题的作法算一个小idea:咱们能够用流量来表示“需求量/改变量”等值,
而后经过是否满流来判是否存在合法分配方案
也就是说一张图最大流等于最小割。
感性理解一下的话……你想,最大流是小于等于割的……
你一个最大流拍上去,S到T就已经不存在通路了……
咱们须要考虑两个东西:一条边可不可能在最小割中,和一条边一不必定在最小割中
在你跑完一遍最小割以后,在割集上的边是必定满流的
咱们给残量网络跑tarjan缩点,若是一条边可能在最小割中,那么它的两端点不在同一个联通块里;
若是一条边必定在最小割中,那么其(原图上)的起点会和S在一个联通块里,终点会和T在一个联通块里。
最多见的模型是“每一个决策有多种选择,咱们选择其中的一个”这种问题
最小割中的“割掉”就表明了“选择/不选择”
这个表明选择仍是不选择看你最后要最大仍是最小……
若是要最大,咱们一开始先累加sum,再减去最小割
由于建图以后若是有流量就证实存在冲突,
没有流量的时候咱们就用最小的代价消除了全部的冲突
若是咱们要最小,那就直接流,割掉的就是选择的
但有的时候也可能会出现有三种或者更多种状况,咱们只能选择其中之一
这也好说:咱们建一串点,这里面最小的一个就会被割掉
若是点对之间的贡献不只仅是点权,还有些附加条件(同时选,同时不选,一个选一个不选,blabla……)
咱们手动构造一下,因为“ 最小割中的“割掉”就表明了“选择” ”
咱们就讨论一下全部选择状况,使对应状况下被割掉的边流量之和等于权值
这彷佛被称做“文理分科模型”
这是一种经典模型……因Hnoi的切糕一题得名“切糕模型”
咱们会有每一个元素有多种选择,相邻两个元素之间的选择会相互限制。
好比切糕一题限制相邻两个点选择元素的下标不超过D
这时,咱们从每一个下标x向下标x-D连一条inf的边
若是相邻两个元素的距离超过D,那么必然会因为inf边的存在而存在其余通路,
致使咱们割掉权值更大的边
可是切糕模型不只仅能够这样用
好比ctst2009的移民站选址,这题的模型就很是不错
被称为切糕改23333
如今至关于每一个点有m种选择,每种选择有花费,
可是不一样点(好比i,j)的不一样选择还会产生选择的标号差($|pi-pj|$)*特定常数($b(i,j)$)的花费
这样咱们把任意两个点的相同选择之间加上一条$b(i,j)$的双向边,
若是i割掉了pi,j割掉了pj,那么这俩之间会出现$|pi-pj|$条流量为$b(i,j)$的边
若是最终选择就是pi和pj,那么这$|pi-pj$|条边都会满流
这样就知足了题给模型
这样的确是很666的,咱们经过利用最小割的性质(不存在通路),
而且利用题给条件的特色(pi-pj)来考虑一种建模的改造:为限制距离的边加上权值
总之挺神的……这题也不知道出题人怎么想出来的
还有一种状况:和最短路有关的选择问题:即每一个点到1最短路长度不一样不一样有不一样收益
这样的话,咱们就把距离限制当作边,对于原图边$u->v$,咱们转化为限制$|d_{u}-d{v}|<=1$
而后开始跑就好了
再来一个小问题:若是如今在网格图上,不是限制相邻两个的差不超过定值,而是限制和不超过定值呢?
那么咱们黑白染色,黑点建决策链从1到n,白点从n到1,这样的话就能够用以前差的连边方式处理和了。
把原来的权值x变成maxn-x,maxn为一个大于所有x的值,
这样割掉的最小边就是原来的最大值了,而后就能够了。这样建图的确很巧。
把一开始的流量设置为收益+损耗,累加的时候只加收益
这样的话,咱们若是最后的决策是损耗,答案就会贡献“收益-(收益+损耗)”= -损耗
---over----
bzoj1001 bzoj1797 bzoj3144 bzoj3218
bzoj1497 bzoj3996 bzoj2756 bzoj2127
bzoj2039 bzoj3774
---waiting---
bzoj4519 bzoj4435 bzoj2229 bzoj3681
codeforces793G bzoj4957
最多见的最大权闭合子图只是在最小割的基础上用inf边添加一些限制条件便可
有的时候,最大权闭合子图作着作着会变成最小割
也就是说,若是咱们如今不是说“选x必须选y”,
而是“咱们能够选z以后选y,也能够选x以后选y”
归纳的说就是当咱们用最大权闭合子图处理“或“的条件的时候
朴素的作法行不通了
这时候,咱们能够考虑全部可能的状况,而后把他们串到一块儿跑最小割。
而且串到一块儿的顺序也是有讲究的……不能串乱了
---over----
bzoj1565 bzoj4873 bzoj4501 bzoj3438
bzoj3232
(听说这些都是用线性规划推出来的......我并不会)
模型之一是k覆盖问题,给出一些带权区间,权值为a要求选出一部分使得每一个数最多被k个区间覆盖而且所选区间权值和最大
先把序列用流量为k的边串起来(S->1->2->3.......->n->T这样),这样限制了通过次数k
接着为了选权值最大,咱们由每一个区间的左端点l向右端点右侧(r+1)连流量为1,权值为ai,而后跑一个最大费用最大流便可
因为咱们跑的费用流创建在最大流的基础上,所以每一个点被覆盖的次数不会超过k次,不然就会在后续增广时反悔
还有一个类似的模型是每一个点有权值a,每一个长度为m的区间最多能选k个,要求所选点权最大
一样把序列串起来,而后对于每一个点i向它后方第m+1个点连流量为1,费用为ai的边,一样跑一个最大费用最大流
感性理解和上面那种建模相似,可是具体证实须要线性规划的知识......
好吧我在这里写了写不用线性规划的理解方式……想看能够看一看
其实这种模型能够归纳为一类”核糖体+tRNA“模型(名字我本身起的233)
也就是说,那个长度为m的区间就是移动的核糖体,咱们从原点放出来k个tRNA(流量),
而后对于每个长度为m的操做区间,每一个tRNA都只能操做一次
这个操做的体现就是流经咱们上面加的那个跳跃的边……而后他会跳到m个单位长度以后,那是第一个不包含它的区间
而后在下面咱们连一溜点,流量体现了咱们对”不进行操做“的限制,即限制一段区间只能有一些tRNA不进行操做
也就是说 咱们经过下面的流量逼着tRNA去走上面的边
而后大概就能够了,这样咱们就能跑出来对应的限制
固然,若是咱们用线性规划的话,咱们能够用把等式差分的方法来解决,不在这里讨论了。
---over----
bzoj1877 bzoj2548 bzoj3876 bzoj2324
bzoj2055 bzoj1070 bzoj4514 bzoj3171
bzoj2879 bzoj3550 bzoj1283 codechef_SEP12_PARADE
不用说话,本身体会:http://www.cnblogs.com/liu-runda/p/6262832.html
---over----
bzoj3876 bzoj2055 bzoj2502 bzoj4200 bzoj4213
线性规划在网络流问题中的应用非常普遍,
由于网络流问题能够把每一个点/每条边的流入流出量看做变量,把最终答案看做目标函数来解决.
这一部分的知识属于根本性的解决问题方法,掌握这种建模技巧确定比背建模套路管用
如今我暂时没有时间去学习这方面的知识......联赛以后这个坑必定要补上的.
我回来补坑了
线性规划和网络流的使用和上下界其实长得差很少……
咱们考虑,设$x_{i}$为每一个变量是否选择,那么大概会有一串柿子像这样:
$\sum x_{j}>=A_{i}$
首先咱们转成等式……
$\sum x_{j}==y_{i}+A_{i}$
咱们加入2个等式$0==0$把这些等式差分
$\sum x_{j}-\sum x_{k}==y_{i}+A_{i}-y_{i+1}-A_{i+1}$
$\sum x_{j}-\sum x_{k}+y_{i+1}-y_{i}+A_{i+1}-A_{i}==0$
而后……这个柿子的本质是流量平衡,减(-)表明流出,加(+)表明流入
咱们发现这个东西就是一堆常数项加上一堆变量对吧
而后对于全部的元素 咱们都知足一个原则:入正出负
若是两个柿子有相同的变量,那么从负的那个(出)向正的那个(入)连边(辅助变量也算,连inf)
而后若是一个常量x是正的,就由s向它连x;不然它向t连-x
如今咱们至关于要求一个可行流
对于常量,咱们创建附加源点和汇点,依然遵循入正出负连边
有一种不用动脑子的记忆方法是移项到每一个前面都是正的,而后一侧有变量表明出边,一侧表明入边
而后对于附加源汇跑你想跑的流………
上面费用流那个序列限制建模也能够用线性规划来理解
---over----
bzoj1061 bzoj4842
不清楚分类的题目:
bzoj2095 bzoj4213 bzoj4067
loj6045 loj2006 loj536 bzoj2229
uoj217 uoj168 uoj77 bzoj2597