zoukankan      html  css  js  c++  java
  • 二分图&网络流

    Some Definitions

    二分图:可以将图的点集分为(X,Y)两部分,满足不存在边连接(X,Y)两个点集。默认(|X|le|Y|)
    补图:(G=(V,E))的补图(G'=(V,{(u,v)|(u,v) otin E}))
    最大匹配:最大的任意点最多只被一条边覆盖的边集。
    最小点覆盖:最小的任意边都至少有一个端点被覆盖的点集。
    最小链覆盖:最小的任意点都被覆盖的不存在相交链的链集。
    最长反链:最大的任意两点相互不可达的点集。
    最大独立集:最大的生成子图为空集的点集。
    完美匹配:二分图的最大匹配至少完全覆盖了二分图的两个点集(X,Y)中的一个。
    二分图的邻集:(forall Wsubseteq X,S_W={vin Y|exists uin W,(u,v)in E})(S_W)(W)的邻集。(当然把(X,Y)反过来也没问题。)
    DAG的对应二分图:一个DAG(G=(V,E))的对应二分图为((Xcup Y,{(x_u,y_v)|exists(u,v)in E}))
    割:给定一个网络(G=(V,E)),若删掉一个边集(E'subseteq E)会使得源汇点不再连通,那么称(E')(G)的一个割。
    最小割:最小割(C(G))(G)的割中边的容量和最小的一个割。
    闭合子图:对于有向图图(G=(V,E)),其点集(Ssubseteq V)是闭合子图当且仅当({v|exists uin V,(u,v)in E}subseteq S)
    扩展图:对于一个有向图(G=(V,E)),其扩展图为(ex(G)=(Vcup{s}cup{t},{(u,v,+infty)|(u,v)in E}cup{(s,u,w_u)|w_u>0}cup{(u,t,-w_u)|w_u<0}))。说人话就是把原图中的边的边权定为(+infty),源点到所有正权点连边权等于点权的边,所有负权点到汇点连边权等于点权的绝对值的边。
    简单割:所有边都与(s)(t)相连的割。

    Some Theorems

    Hall定理:二分图存在完美匹配(Leftrightarrowforall Wsubseteq X,|W|le|S_W|)

    推论:一个二分图的最大匹配数为(|X|+min(0,minlimits_{Wsubseteq X}(|W|-|S_W|)))

    König定理:二分图的最小点覆盖数等于其最大匹配数

    因为最大匹配的边的端点是不相交的,所以最小点覆盖数至少不会小于最大匹配数。
    如果我们能够给出一组构造方案,那么就证明了该定理。
    下面将给出由最大匹配构造最小点覆盖的方法。
    我们知道匈牙利算法中要寻找的增广路是一条边在当前匹配,下一条边不在当前匹配,且起点和终点都未被覆盖的路径。
    在起点集中枚举每一个未被最大匹配覆盖的点,从这个点出发找到以其为起点的所有增广路,并标记路上的所有点。
    最后起点集中未被标记的点和终点集中被标记的点就是最小点覆盖。

    定理:二分图的最大独立集为最小点覆盖的补集

    把最小点覆盖去掉后,一定不存在两个端点都未被去掉的边,因此剩下的就是最大独立集。

    推论:二分图的最大带权独立集等于总点权减去最小割

    定理:一张图的最大团等于其补图的最大独立集

    定理:一个DAG的最小链覆盖数等于总点数减去其二分图的最大匹配数

    最大匹配中的边(u,v)就相当于把原图中的(u,v)两个点缩成一个点,所以最后剩下的点数即最小链覆盖数等于总点数减最大匹配数。

    Dilworth定理:DAG的最长反链数等于最小链覆盖数

    懒得证了,下面给出构造方法。
    设DAG有(n)个点,其最大匹配数为(m)
    先构造出DAG的二分图,求出其最大独立集。
    然后如果(X_i,Y_i)都在独立集中,我们就将其加入反链。

    最大流最小割定理:最小割等于最大流

    若最小割小于最大流,那么割掉这些边之后残量网络中一定还有增广路。因此最小割大于等于最大流。
    如果我们能够构造一组方案使得最小割等于最大流,那么该定理成立。
    从源点开始把残量网络BFS一遍,标记源点能够到达的点。连接标记点和未标记点的边构成最小割集。

    定理:有向图(G)的最大权闭合子图的点权为其扩展图(ex(G))去掉(C(ex(G)))之后(s)能够到达的点构成的点集。

    我们先给出两个显而易见的小结论:
    (1.ex(G))的最小割一定是简单割。
    (2.)割掉(ex(G))中任意一个简单割之后(s)所能到达的点构成的点集是一个闭合子图。
    (s)能到达的点构成的点集为(S)(T=V-S)
    最小割对应的(S)是一个闭合子图,接下来你我们就将证明(S)是原图的最大权闭合子图。
    一个割的容量(F(E')=sumlimits_{uin Twedge w_u>0}w_u+sumlimits_{uin Swedge w_u<0}|w_u|)
    其对应闭合子图的点权和(W(E')=sumlimits_{uin S}w_u)
    那么(F(E')+W(E')=sumlimits_{uin Vwedge w_u>0}w_u)是一个定值。
    因此(F(E'))越小(W(E'))就越大。
    所以最小割对应的闭合子图就是最大权闭合子图。

    Some Extensions

    最长反链

    可能在最长反链中的点

    枚举每一个点,把与它相关的点删掉,再跑最长反链。
    如果新的长度是原本的长度(-1),那么这个点就在最长反链中。

    一定在最长反链中的点

    枚举每一个点,把它删掉,再跑最长反链。
    如果新的长度是原本的长度(-1),那么这个点就在最长反链中。

    二分图最大匹配

    可能在二分图最大匹配中的点

    所有有度数的点都有可能。

    一定在二分图最大匹配中的点

    在最大匹配且在残量网络中(s)无法到达的左侧点和无法到达(t)的右侧点。

    可能在二分图最大匹配中的边

    先求出任意一个最大匹配(M)(M)中的边都可能在二分图最大匹配中。
    然后考虑其它的边,如果该边有至少一个端点不在(M)中,那么这条边可能在二分图最大匹配中。
    如果两个端点都在(M)中,那么我们需要一个交错环才能把这条边加入最大匹配。
    那么我们将(M)中的边从左往右定向,不在(M)中的边从右往左定向,如果一条边的两个端点在同一个SCC的话,那么这条边也可能在二分图最大匹配中。

    一定在二分图最大匹配中的边

    先求出任意一个最大匹配(M),一定在二分图最大匹配中的边是(M)中不属于任意一个交错环的边。
    那么我们将(M)中的边从左往右定向,不在(M)中的边从右往左定向,如果一条(M)中的边的两个端点不在同一个SCC的话,那么这条边一定在二分图最大匹配中。

    最小割

    最小割输出方案

    如果一条边((u,v))满流,且(u)(s)连通,(v)(t)不连通,那么将这条边加入最小割。

    可能在最小割中的边

    对残量网络tarjan,如果一条满流的边的两个端点不在同一个SCC中,那么这条边可能在最小割中。

    一定在最小割中的边

    对残量网络tarjan,如果一条满流的边((u,v))满足(u)(s)在同一个SCC,(v)(t)在同一个SCC,那么这条边一定在最小割中。

    环覆盖问题1

    给定一个有向图,选出若干个点不相交的环,最小化环覆盖的点集升序排序后的字典序。

    给每个点加个自环,这样我们转化为了每个点入度出度为(1)
    建原图的二分图,跑一个完美匹配出来。
    然后从小到大枚举每个点,如果该点不是被原图中的自环(即二分图中自己连自己)所覆盖,那么把这个点加入点集,跳过。
    否则删掉该点在原图中自环对应的边,找一条从该点对应左侧点到该点对应右侧点的增广路。
    如果找到了,那么把增广路上的边的状态反转,并把这个点加入点集中。

    加自环这个套路在其他环覆盖问题中也很有用。

    上下界网络流

    每条边的流量有上界和下界([l(u,v),r(u,v)])

    ⽆源汇上下界可⾏流

    新建源点汇点(s,t)
    对于原网络中的边((u,v,l,r)),在新网络中建(3)条边:((s,v,l),(u,t,l),(u,v,r-l))
    然后跑最大流,如果所有连接(s)的边都流满了那么说明存在可行流,原图中((u,v,l,r))的流量为(l+)新图中((u,v,r-l))的流量。

    有源汇上下界可⾏流

    加一条边((s,t,0,+infty)),然后跑无源汇上下界可行流。

    有源汇上下界最大流

    先跑一遍有源汇上下界可⾏流,然后还原出原图的流量网络及残量网络,再在原图的残量网络上跑(s ightarrow t)的最大流。

    有源汇上下界最小流

    先跑一遍有源汇上下界可⾏流,然后还原出原图的流量网络及残量网络,再在原图的残量网络上跑(t ightarrow s)的最大流。

    最大密度闭合子图

    ( ho=frac{|E|}{|V|})

    二分答案(mid),现在问题变成了判定是否有一个闭合子图满足(|E|-|V|mid>0)
    如果我们不考虑闭合这个限制的话,最优的选法肯定是选择所有的边,放弃所有的点。
    也就是说现在我们有(|E|)点收益,放弃一条边会付出(1)的代价,选择一个点会付出(mid)的代价,必须满足选择一条边就选择它的两个端点。我们希望最小化付出的代价,然后检查代价是否小于(|E|)
    考虑最小割,(s)到每条边流量为(1),每个点到(t)流量为(mid),每条边到两个端点流量为(+infty)
    那么这张图的最小割就是最小代价。

    距离限制模型

    (n)个取值在([1,m])内的整数变量,如果第(i)个变量的取值是(a_i),那么需要付出(c_{i,a_i})的代价。
    同时给定一些限制(a_u-a_vle d)
    求满足限制下的最小代价。

    (n)(s->x_{i,1}->cdots->x_{i,m}->t)的链,其中连向(x_{i,j})的边的容量为(c_{i,j}),连向(t)的边的容量为(+infty)
    在这个网络上求最小割,得到的就是没有限制下的最小代价。
    然后对于限制(a_u-a_vle d)(forall iin(d,m]),新建((x_{u,i},x_{v,i-d},+infty))
    在这个网络上求最小割,得到的就是有限制下的最小代价。

    二元关系最小割模型

    (n)个bool变量,其中第(i)个变量的取值为(0/1)会获得(u_i/v_i)的收益。
    同时给定一些限制,如果第(i)个变量取值为(a),第(j)个变量取值为(b),那么需要付出(c)的代价。
    求最大的收益减代价。

    (forall iin[1,n]),连(s ightarrow i ightarrow t)
    如果割掉(s ightarrow i)就代表(i)(0),如果割掉(i ightarrow t)就代表(i)(1)
    然后对于限制((i,j,a,b,c)),连(ileftrightarrow j)
    边的容量可以列方程解出。

  • 相关阅读:
    网络流二十四题之魔术球问题
    网络流二十四题之P2764 最小路径覆盖问题
    网络二十四题 之 P2756 飞行员配对方案问题
    网络流 之 dinic算法
    网络流 之 增广路
    中南
    2249: Altruistic Amphibians 01背包的应用 + lh的简单图论 图转树求lca
    今日训练 搜索
    AD-logon workstation
    Centos7-docker安装
  • 原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/11688296.html
Copyright © 2011-2022 走看看