有关网络流
1. 关于模板
- 最大流一般Dinic就解决掉了
- 费用流的话,一般EK都能搞出来,然后如果被卡了的话,就写一个类似Dinic的东西就好了,基本没啥变化,自己YY一下就想出来了
2. 关于最大流
普通最大流
似乎没啥题,我见过的都是裸题
有关最小割
关于最小割的东西还是不少的,那么从头开始说
-
直接最小割
这个东西一般都不是网络流题,但是通常网络流可以爆踩std...
例子的话:BZOJ1001 狼抓兔子 NOI2010 海拔
-
一起选一些点会发生一些事情
这种东西一般考新建一个虚点,然后把代价从原来的点连向这个点,然后向其他的点连流量为正无穷的边
-
上述问题的裸题,直接按照上述方式建图然后最小割即可
-
先黑白染色,然后白黑分别连向源汇,流量为$a[i][j]$,然后对于每个点新建一个点,然后,对于白点新建一个点,把白点连向这个点流量为$b[i][j]$,对于黑点也新建一个点,然后把这个点连向黑点,流量为$b[i][j]$,然后对于每个新建的点,然后把这个点连向四周的点或者从四周连向这个点即可。
-
先拆位,因为每位之间的贡献是互不影响的,然后对于每个有数字的节点,分为$0,1$,然后$S -> 0$,流量为$infty$,$1 - > T$流量为$infty$,剩下的对于原图中每一个边练一下流量为$1$的边即可。这样的最小割即为第一问的答案,然后因为流是确定的,所以贪心的找到必须为$1$的点的个数第二问就解决了
-
如果没有限制的话,显然可以建图,从底向上,多建出一层点,然后每条边的流量就是对应层的代价即可,然后加入$d$的限制之后,就只需要把每个点连向旁边的深度比它大$d$的点,流量为$infty$,道理很简单,这样如果$i$层的边被割了,那么就从这一层的$i+1$位置走到旁边的$i+1+d$的位置,然后并且会从$i-d$回到$i$这个位置,如果不在这个区间内割开的话,原图就还是联通的。
-
先把$S - > i$,流量为$b[i]$,然后把$i - > T$流量为$w[i]$,对于奇怪的方格的限制可以新建一个点,并把$i$指向这个点,流量为$p[i]$,然后再把这个点指向可能会导致这个点奇怪的点即可,流量显然为$infty$。
-
-
最小割树
咕咕咕
最大流常见建图方式
-
混合图欧拉回路
随意钦定无向边方向,由于欧拉回路要求每个点的入度等于出度,并且入读+出度为偶数
所以对于每个点,$S- > i$连一条出度流量的边,$i-> T$连一条入度流量的边,然后对于原图中的每一条无向边,由于可以反悔,所以假设你钦定了是$x->y$,连一条$x-> y$,流量为$2$的边即可,原因很简单,因为可以反悔,所以对于每个点如果出度较多,就需要把某一些出边变成入边,反之就需要把某一些入边变成出边,每次会让出边-入边的差减少$2$。
-
最大权闭合子图
将每个点权分正负,对于正点,$S->i$,流量为$a_i$,对于负边,$i->T$,流量为$-a_i$
对于原图中的每一条边,$x->y$连一条流量为正无穷的边,然后正权边的和-最大流即为答案
-
最大密度子图
通过01分数规划,我们二分每个点的代价,然后对于这个代价建立最大权闭合子图即可。
每次验证最大权闭合子图是否为$0$即可
3. 关于费用流
普通费用流
一般这种题,费用流都不是正解,或者正解需要优化建图方式,这种题的费用流模型十分简单,并且费用流部分不作为考点存在
其中一部分是可以通过贪心+数据结构优化到$O(nlog n )$或者$O(n log ^2 n)$
另一部分则是同样通过数据结构或者其他的什么东西优化边数来优化复杂度
详情见:
常见费用流模型
-
最小等待时间问题
一般的解决方案是拆点
-
这个题是这种题的一个常见形式,把$m$个人拆成$n$个点
对于第$i$个人的第$k$个点,把这个人向第$j$个车连一条流量为$1$,费用为$map[j][k] imes i$
这个道路很简单,表达的意义就是第$i$个人,倒数第$k$个修$j$这个车
然后$S$向所有人连边,所有车向$T$连边
-
和修车大概啥区别都没有,就是需要动态开点...
-
-
费用流拆边
一般解决的问题长成,最小化$(x)^2$其中$(x)$是一个式子,然后可以通过建出$n$条费用不同的边来解决
先把问题转化为,求三个点不构成环的方案数
然后可以发现,对于这样的方案一定满足其中有两个点是指向同一个点
那么也就是$C(n,3)-sumlimits_{i=1}^nC(d[i],2)$
然后最小化后者,转化为求最小化:$sumlimits_{i=1}^n d[i]^2 - d[i]$
可以发现后面的$d[i]$的和是固定的,也就是$sumlimits_{i=1}^n i=frac{n imes (n-1)}{2}$
那么就是最小化$sumlimits_{i=1}nd[i]2$,对每个点拆边,费用分别为$1,3,5,7...$
-
线性规划转费用流
“事实上任何最大流,最小费用流,上下界网络流都是在解决一个线性规划问题”(摘自 wyfcyx 大爷的ppt)
具体地,在一个网络流问题中,把边看作变量,把点看作限制条件,就会得到一个线性规划问题。
当然,由于网络流的特性,这类线性规划问题只能是:每个变量出现次数为且仅为$2$次,且$1$次系数为$+1$,$1$次系数为$-1$。
如果我们能够将这类特殊的线性规划问题转化为网络流问题,就可以圆满地解决原问题。
我们设:第$i$天招募的志愿者数量为$P_i$,$j$种志愿者招募了$k_j$个
那么对于$P_i = P_{i-1}+ sumlimits_{S_j=i} k_j - sumlimits_{T_j=i-1}k_j $
我们要满足:$P_i ge A_i$,所以我们设$B_i $为一个自然数,即:$P_i = A_i+B_i$
那么我们可以得到:$P_i - P_{i-1} = A_i + B_i - A_{i-1} - B_{i-1}$
将$P_i = P_{i-1}+ sumlimits_{S_j=i} k_j - sumlimits_{T_j=i-1}k_j $带入上式可得:
$sumlimits_{S_j=i} k_j - sumlimits_{T_j = i-1}k_j = A_i +B_i -A_{i-1}-B_{i-1}$
那么:$A_i+B_i + sumlimits_{T_j =i-1}k_j = A_{i-1}+B_{i-1} + sumlimits_{S_j=i}k_j $
那么对于这样的一个式子,我们发现,如果把招募$k$个志愿者看作流出流量,到期看作在下一天流入流量,同时把前一天看作是流出流量,当天所需看作是流入流量,然后再把这天多余的当作流出流量,然后把下一天的多余流量流入今天。
这样如果每个点都流量平衡就满足要求了,那么就按照上述东西跑一个费用流就好了。
4. 关于有上下界网络流
对于这种类似问题,如果原图有源汇,那么就把汇向源连一条当前网络能够允许的最大流量的边,然后剩下的就转化为无源汇问题了。
然后做题的技巧是,先建出对应的可行流模型
然后再可行流的模型上构建真正需要的模型
一般可以把连边的流量写成不等式或者等式的形式
有上下界可行流
对于这种问题,我们可以转化为类似于混合图欧拉回路的方法解决。
也就是,我们将每条边先钦定都流下界那么多的流量,然后有些点可能就会流量不平衡
这个时候,我们将$S->i$如果流入>流出,并且流量为流入$-$流出,反之,我们将$i->T$,流量为流出$-$流入
然后对于原图中的每一条边,因为每条边可以在上届与下界之间反悔,如果多流的话,代表着起始点的流入增加,终止点的流出增加,那么如果能够通过调整当前图的流量满足流量平衡,那么就可以,反之就不可以。
有上下界最大流
似乎没啥营养?
一般问题都包含源汇,然后就可以把新建的源汇去掉,把汇向源的边去掉。
然后在残余网络上跑原图源汇直接的最大流即可
(其实这个有上下界一点意义都没有,这个本质上就是转化成了有上下界可行流判断可行性+如果可行,答案一定为原图最大流
有上下界最小流
和上面的求法一样,不过跑的是汇到源的最大流
然后可行流的流量减去这个流量就是最小流
有上下界最小费用可行流
直接用可行流模型边加上费用跑费用流就行