zoukankan      html  css  js  c++  java
  • 一些网络流知识

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

    无向图:

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

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

    以上是基本构图。


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

                         ||

                          最小边覆盖

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


    以下转自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;

    构图如下:


  • 相关阅读:
    Linux操作系统原理
    html标签简介(常用)
    Git常用命名
    Nuxt.js vue服务端渲染
    Sequelize 和 MySQL 对照Sequelize 和 MySQL 对照
    VScode 自定义用户代码块
    python对一个文本的解析
    API管理工具
    Flutter教程- Dart语言规范-知识点整理
    RESTful API
  • 原文地址:https://www.cnblogs.com/hsuppr/p/3166745.html
Copyright © 2011-2022 走看看