一些网络流知识

有向图:点无容量不用说,点有容量拆点。

无向图:

  点无容量:正反边都有容量。

  点有容量:拆点,一个代表出点,一个代表入点,入到出有点容量,出点连其他点入点。

以上是基本构图。


最大匹配 = 最小点覆盖 = 所有定点数 - 最大独立集

                     ||

                      最小边覆盖

最小路径覆盖 = 原图点数 - 新图最大匹配(最小路径覆盖要拆点做)


以下转自http://tieba.baidu.com/p/2430347466

n支球队打循环赛,每两个队赛一场,胜+2分,平+1分,负+0分,已知一些比赛的胜负,问球队1是否可能获胜?

  • cfgbdnm对于每场比赛,看作一条容量为2的双向边,且每条边上的流量为2。

 

  • cfgbdnm利用预流推进的思想:在每条边上处理一个流量为2的预流,对于已知结果的比赛把预流按得分的数值分配到节点的溢出值上,令节点一在剩余的比赛中全胜,其他的比赛任意分配预流并连边,创建一个没有源和汇的流网络。然后不断把溢出值大于点1得分的节点的流向外推,如果某节点的高度大于2*n则无解。
    cfgbdnm 以上做法已被钱桥学长吐槽:你能保证写对吗?轻吐槽:学长,预留推进方法比增广路方法要容易实现的多,思维也直观得多……
  • cfgbdnm加强版,求一号的最小得分:首先二分答案key,依然那么建图,但是将节点1的尚未确定的边也连上,然后把向外推的条件改为判断溢出值是否大于key。
  • cfgbdnm利用网络流的建图方案:从源连到每个比赛val=2,比赛连到相应的两个点val=2或正无穷,每个点连到汇val=该点的分数限制。
    cfgbdnm在图上跑最大流,如果源的出边满流表示有解。
    cfgbdnmPS:后面的做法点数是N^2的,真希望今年的NOI出一下这道题的加强版,把后面的做法卡掉,让我的做法能过…… 
 
一些OIer,每个OIer有若干属性{武力、智力、魅力……}(OIer们怒了:丫的,你当我们是QQ宠物企鹅吗!!)如果一个OIer的各属性都>=另一个OIer,则可将其收为小弟(小妹),如果两人的属性一样则先出手的人能收另一个,每个人能收K次小弟(小妹),求一个收服方案,使剩下最少的OIer不给别人做小弟(小妹)。
  • cfgbdnm问题等价于求最多收多少次小弟(小妹)。
  • cfgbdnm 先做一个预处理处理出所有的i、j,其中i可以收服j,特别的,对于相同的i,j,把他们合为一个人,收服次数改为ki+kj-1。
  • cfgbdnm 从源点向每个人i连边val=ki,如果i能收j,则连边i->j' val=1,从每个人i向汇点连边val=1。
  • cfgbdnm 该图的最大流=最大的收服次数。
 
最大密度导出子图:
对于一般求sigma(V)-sigma(E)的问题(似乎应该叫最大权导出子图),直接转化为最大权闭合图问题求解即可。(PS:昨天明明想到正确的最大权闭合图的建图方案了,结果一时脑残以为那个方法是错的(就是从每个边向两边的点连有向边,但实际上只要边的权值都为正就是对的))。
最大密度导出子图求的是sigma(V)/sigma(E)=k:
二分k的值判断是否有sigma(V)>sigma(E)*k,将所有的点权*=k,建立最大权闭合图模型,如果该值>0,则存在。

 

平面图的最小割:
可用最短路的方法求割值。
以前曾经做过BZOJ狼抓兔子,NOI海拔,知道是有这么一个方法的。
狼抓兔子这道题是直接连边即可。
海拔那道题边的两边的值不同,但有一个比较简单的处理方法,如果原图方向是从源到汇,最短路模型里就是从s到t,反之亦然。
  • cfgbdnm更一般的,最短路模型的处理方法是对于原图中每个域建立一个点,其中与源和汇相邻的域被分成两份,而边的方向只需统一向任意方向扭转即可。
  • cfgbdnm更更一般的,只需求一个最短的回路SP,使得(SP套住源)^(SP套住汇)即可。
  • cfgbdnm从源和汇引出两条不穿越任何点的射线Ls,Lt,定义一个DP系统{S={status},T={transformations}},对每个域i有p(ID i,B s,B t)in S,对每条边e(隔开的域为i->j)有p(i,s,t)+e.val->p(j,s^e*Ls,t^e*Lt)。
  • cfgbdnm做法:for =each<域 i>{format f(i,s,t)=s||t?INF:0;for =each<j> exist(i->j){tranform i->j}end =for;f(i,s,t)=INF;DP_system.update();update =min<ans>{f(i,s,t) exist s^t};end =for;
 
  • 给一个矩阵,find =exist<多哈密尔顿回路> :经过每个点恰一次;
  • cfgbdnm把原图黑白染色,如果|{黑点}|!=|{白点}|,从源向每个黑点连边val=2,对每个黑点向相邻白点连边val=1,白点向汇连边val=2,如果满流则有解。 

 

给一个矩阵,每个店有权值>=0,要求在一些非0点上安排外星瘟神姚顺,代价为点的权值,使得全职为0的点与矩阵边界不连通。
收起回复
  • cfgbdnmset 全职=权值;//再次鄙视QQ拼音。
  • cfgbdnm求最小代价。
  • cfgbdnm把矩阵变成无向图,从源连向要求被隔开的点,把矩阵边上的点连向汇,点权变为点的容量,求最小割。

 

以上转自http://tieba.baidu.com/p/2430347466


 

平面图求最大流转化成最小割。(海拔,狼捉兔子)(s与t都在最外面的区域中)

s与t在一个区域中,连接s和t,求s-t划分开的两个区域的最小割。

s和t不在一个区域中,s和t分别引射线,发现割开s和t的会 (过T的射线奇数次,过S的射线偶数次) || (过S的射线奇数次,过T的射线偶数次)。

因此每个点有两个域记录过s奇偶,过t奇偶,目标是由 每个点(过S偶过T偶 到 过S偶过T奇) || (过S偶过T偶 到 过S奇过T偶)

 一些网络流知识


 有个网格,有些障碍,判断是否存在多条哈密顿回路覆盖除去障碍的点。

黑白染色,黑与白个数不同一定无解。

然后 源 -2> 黑 -1> 白 -2> 汇,满流有解,否则无解。

因为回路上每个点连接两个异色。

 //网格图注意黑白染色。


 下面上道题:

  有n个奶酪,m只老鼠,每个奶酪有个质量w[i],每个老鼠每个单位时间可以吃g[i];(w和g是整数)

  一个奶酪每个时刻最多有一个老鼠吃,可以在任意时刻换老鼠吃。

  问全吃完的最短时间(实数)。

二分答案,v是每个老鼠在时间内吃的总数。

按v从大到小排序分别是v1,v2......vm;

构图如下:

一些网络流知识


 

你可能感兴趣的:(网络流)