zoukankan      html  css  js  c++  java
  • 二分图&网络流&最小割等问题的总结

    二分图基础:

    最大匹配:匈牙利算法

    最小点覆盖=最大匹配

    最小边覆盖=总节点数-最大匹配

    最大独立集=点数-最大匹配

    网络流:

    技巧:

    1.拆点为边,即一个点有限制,可将其转化为边

    BZOJ1066,BZOJ1305

    2.考虑左右两部,即比如横竖、男女、比赛和人等。

    BZOJ1532

    带下界网络流问题

    ----------------------转自zyf-zyf

    ss和tt为附加源或者说超级源

    1.无源汇上下界可行流

      对于(u,v)有向边,上界为a,下界为b 构图方法为:

      (1) ss 到 v 容量为 b

      (2) u 到 tt 容量为 b

      (3) u 到 v 容量为 a-b

     求ss-tt最大流,当且仅当 maxflow=sigma(i,tt)=sigma(ss,i) 时 存在可行流

    2.有源汇上下界最小流

      如果发现原图有源汇,要先转化为无源汇

      其他点如1方法,建图,另加 t-s 容量为 inf 

      求一遍 ss-tt最大流,此时s-t的流量为 t-s这条边的反向边的流量,记为 x

      在残量网络中删去 t-s 边,具体方法为 e[i].v:=0 e[i xor 1].v:=0

      求一遍 t-s最大流(注意是 t-s),记此时的最大流为y

      则最小可行流为x-y (可以理解为求出一个可行流,然后退掉了一些无用流)

    3.有源汇上下界最大流

      构图如2,只是求完ss-tt最大流后,不做记录,也不删边,直接在残量网络上求s-t最大流,即为答案

      (可以理解为,求出一个可行流后,发现还可现流更多的流,就求s-t最大流 之所以可以不删边

       是因为第一次ss-tt最大流完了之后s-t的流量存在 t-s的反向边s-t中,在跑s-t最大流的时候已经将其算入答案)

    题目:BZOJ2502、BZOJ2150、BZOJ1458、BZOJ3876

    ----------------------end

     流量平衡方程构图法:

    例子:noi2008志愿者招募,bzoj1283序列

    列出式子,添加辅助变量变成等式。上下相减。

    常数和为0,将每个式子当作一个点

    常数为正,则(s,x),容量为常数,费用为0

    常数为负,则(x,t) 容量为常数绝对值,费用为0

    对于每个变量,正的向负的连容量为inf,费用根据题目。(辅助变量费用为0)

    然后就可以费用流解决啦

    -------------------------------------------------------

    费用与流量平方 ——拆边,费用分别为1,3,5,7,9....

    最小割问题的总结:

    *意义

    1.加inf的边表示不能被割,通常用于体现某个点必须属于某个集合

      连边(s,u,w)代表如果u不在s割的话需要付出代价w

    2.连边(u,v,w)代表如果u在s割,v在t割需要付出代价w 但注意,如果u在t割,v在s割是不需要付出代价的。 那么如果连边(u,v,w)以及(v,u,w)则说明当u与v所属割不同的时候需要付出代价w

    *技巧

    0.当求一些最大问题时,常常用sum减去代价

      这个代价要求最小,于是可以用最小割解决

    1.两个点i,j属于不同集合时付出val代价

       新建点k (s,k,val) (k,i,inf) (k,j,inf)

      当vals,valt不同时通常要新建点

      但当相同时,可以直接(u,v,w)(v,u,w)表示不在一个集合就付出w代价

      ----------其实这就是最大权闭合子图的解决方法,因为两点必须在同一集合,所以他们之间可以连inf的边表示不可分离

      例题:BZOJ1497,BZOJ2127,BZOJ1934

    2.两个点属于同一集合付出val代价

      这个时候通常图的性质是二分图。(求打脸

      然后我们可以将两部点的性质翻转一下,即左部点连s表示选,右部点连t表示选。

      所以转化后问题变为了第一个。且只需 (i,j,val) (j,i,val)

      例题:BZOJ1976,BZOJ2132,BZOJ3275

    3.如果有负权

      比如一个点属于s集合收益x,属于t集合收益y,  (x,y可能为负数),两个点之间还有二元关系(二分图),即一个点有可能选择负收益,求最大收益

      还是先按照技巧0,将所有正权可能的收益加起来,考虑去掉最小代价

      普通的二元关系等通过技巧2、3建边

      那负权收益如何处理呢?考虑将负权应该连向的边s和t交换,权值再取反。

      因为一开始的最大值中就没有加负权,如果要割断该点,一定是正权边和负权边一起被割断,答案合法。如果不在此处隔断,即两边均不需割,答案不变,恰好是取正权的答案。

     (语死早,还不肯定自己讲的是对的23333

    相关论文:彭天翼 《浅谈一类最小割问题》

  • 相关阅读:
    LeetCode "Palindrome Partition II"
    LeetCode "Longest Substring Without Repeating Characters"
    LeetCode "Wildcard Matching"
    LeetCode "Best Time to Buy and Sell Stock II"
    LeetCodeEPI "Best Time to Buy and Sell Stock"
    LeetCode "Substring with Concatenation of All Words"
    LeetCode "Word Break II"
    LeetCode "Word Break"
    Some thoughts..
    LeetCode "Longest Valid Parentheses"
  • 原文地址:https://www.cnblogs.com/wjyi/p/5665348.html
Copyright © 2011-2022 走看看