• [线性规划与网络流24题]网络流常见模型[转载]


    转载自:http://blog.csdn.net/ruoruo_cheng

    最近两个月在做《线性规划与网络流24题》这套题,加深了对网络流的理解。

    涵盖到的模型有:二分图匹配、二分图的最大独立集、最大权闭合图、有向无环图的最小路径覆盖、最多不相交路径、最大权不相交路径、区间k覆盖、最短路。第13题涉及到与二分法的结合(其实也可以逐层枚举)。

    二分图匹配

    设二分图G=(V, E)的两个顶点集为X, Y。

    • s->Xi,费用为0,按需赋容量。
    • Xi->Yj,(Xi, Yj)属于E,费用为边权,按需赋容量。
    • Yj->t,费用为0,按需赋容量。
      求(最小费用)最大流。

    二分图的最小覆盖集

    点权之和最小的覆盖集

    • s->Xi,容量为点权。
    • Xi->Yj,(Xi, Yj)属于E,容量为inf。
    • Yj->t,容量为点权。
      求最小割,由最大流最小割定理,求解最大流即可。

    定义不包含容量为inf的边的割为简单割。本网络中,最小割是简单割。

    什么叫覆盖集?对于每条边,其两端点至少有一个被选中。割的性质是不连通:任何一条s-t路径上,至少有一条边属于割集。这里所有的s-t路径由3段构成,中间的Xi->Yj容量为inf,不属于简单割。因此,二分图的覆盖集和简单割一一对应。最小割是容量最小的简单割,也是点权之和最小的覆盖集。

    对于不带权的二分图图,令所有点点权=1。以这种方式我们求出的是其最小覆盖集,也是其最大匹配。因而,我们证明了König定理:二分图的最大匹配等于最小覆盖。

    顶点数最多且点权之和尽量大的覆盖集

    • s->Xi,容量为1,费用为点权的相反数。
    • Xi->Yj,(Xi, Yj)属于E,容量为inf,费用为0。
    • Yj->t,容量为1,费用为点权的相反数。
      求最小费用最大流。

    二分图的最大独立集

    最小覆盖集和最大独立集是互补问题。

    覆盖集:对于每条边,至少选一个端点,即至多不选一个端点。
    独立集:对于每条边,至多选一个端点,即至少不选一个端点。

    求最大独立集,等价于求其补集,也就是说每条边刨出至少一个端点,并且刨出的点的权和最小,这样才使剩下的最多。|最大独立集|+|最小覆盖集|=所有点的权值之和。

    最大权闭合图

    设正权点的集合为V+,负权点的集合为V-。

    • s->u,u∈V+,容量为点权的绝对值。
    • u->v,(u, v)∈E,容量为inf。
    • v->t,v∈V-,容量为点权的绝对值。
      求最小割,用正权点减去割的容量即得最大的权。

    可行性方面,简单割和闭合图一一对应。设简单割为[S, T],S-{s}即为闭合图中的点。
    简单割对应闭合图:反证。假设存在u∈S-{s},v∈T-{t},且(u, v)∈E。因为(u, v)∈E,所以网络N=(V’, E’)中存在(u, v)∈E’且c(u, v)=inf。又因为u, v分属s, t,所以这条边属于[S, T],与简单割的假设矛盾。
    闭合图对应简单割:反证。假设[S, T]不是简单割,那么存在u∈S-{s},v∈T-{t},且c(u, v)=inf。这只会当存在(u, v)∈E时发生,与闭合图的假设矛盾。

    数量关系方面,最小割意味着最小化“刨开的正权+保留的负权的绝对值”。用正点权之和去减,得到“保留的正权-保留的负权的绝对值=保留的正权+保留的负权”。

    有向无环图的最小路径覆盖

    • s->Xi,容量为1。
    • Xi->Yj,(i, j)∈E,容量上界为1。
    • Yi->t,容量上界为1。

    DAG的最小路径覆盖=|V|-对应二分图的最大匹配。

    约束是什么?对路径的定义中,有至关重要的一点:允许长度为0。于是解的存在性得到了保证。因此,只需满足:对于任意一点,至多有一条与它关联的入边和与它关联的出边被选中。
    二分图的匹配,可以从顶点对应的角度看待,也可以从边的角度看待:选出一些边,使得每个顶点至多与一条边关联。和本问题的约束对比,发现有向无环图不是二分图,并且对于顶点而言,边分为入边和出边两类。考虑把点i拆成Xi、Yi,入边连到Yi,出边从Xi出发。这样,问题的约束便和二分图匹配相一致。
    目标是什么?使路径覆盖数最小。除了直接数,还能用什么来刻画路径覆盖数?头的数量或尾的数量。什么样的点是头?没有匹配边与对应的Yi关联。尾?没有匹配边与对应的Xi关联。所以,DAG的最小路径覆盖=|V|-对应二分图的最大匹配。

    hzwer这儿有另一种更简洁的看待方法:

    如果无匹配,显然要n条路径才能覆盖所有点,两个点匹配意味着将可以把它们用一条路径覆盖,路径数就可以减1

    我还有一种另类看待方法:
    带上下界的网络流。
    Step 1
    - s->Xi,容量上界为1。
    - Xi->Yi,容量下界为1,上界inf。
    - Yi->Xj,(i, j)∈E,容量上界为1。
    - Yi->t,容量上界为1。
    求解s-t最小流。

    Step 2
    看出一个可行流,于是省去通常求解s-t可行流的步骤。
    网络变换为:
    - Xi->s,容量上界为1。
    - Yi->Xj,(i, j)∈E,容量上界为1。
    - t->Yi,容量上界为1。
    此网络的t-s最大流与原s-t可行流的叠加,即为原s-t最小流。s-t可行流的值为|V|,用|V|去减t-s最大流即可。

    这种看待方法和hzwer的在实质上相同,但是是从形式上的变换得到的。

    为什么强调DAG?因为我们只是简单地拆点、匹配,而没有在意这两点是否已经在同一条路径里了。比如,一个环,对应二分图的最大匹配为|V|,实际上,作为一条有始有终的“路径”,它是不能封口的。

    最多/最大权不相交路径

    在原图上改造,用容量1描述“不相交”的约束,用源、汇发出、接受的容量限制最大权不相交路径问题中路径的条数。若要求顶点也不相交,可采用拆点的手段给结点赋容量。

    最短路

    把状态看作顶点,状态的转移看作边,边权是转移的代价。如果一个问题有最优子结构、重叠子问题两个性质,令你很想使用动态规划方法,却苦于无法确定计算顺序,那么不妨尝试最短路模型。有时,用不着把图存起来,把转移写在最短路过程里即可。这样免去了分层图的一些麻烦,也提高了程序的时间效率。
    状态是什么?哪些量能简洁而完整地刻画它?状态之间的转移关系是怎样的?

    区间k覆盖

    • 离散化。
    • s->P1,容量为k,费用为0。
    • Pi->P(i+1),i

    二分法

    做过两道与之有关的题目:[HNOI2007]紧急疏散evacuate、[CTSC1999]家园。从刘汝佳老师的书上学习了“公平分配问题”。
    前两题的一个共性是相对论的四维时空观:按时间拆点,体现了分层建图的思想。
    可以通过比较流量和待分配的数目,判定此次尝试的成功与否。可以通过修改一些边的容量、修改图的层数,为新的一轮尝试做准备。
    有时,无解的判定、二分上下界的确定成为问题。比如家园一题。我判定无解的方式是,先在三维空间内建图,判定地球、月球是否连通。如果连通,总存在一种方案拯救人类,因为可以等待。但是我估算的二分范围太松了,导致最后一组TLE。在题解的启发下,将上界和某常数取min……不少题解是枚举的,循环到某个常数便停止(说只是TLE和WA的区别……),于是便省去了估算范围这一步骤。由于增广路算法本身就是在一遍遍迭代,这样逐层枚举,由于先前的残存网络尚在,也取得了不错的时间效率。
    在CodeVS 1034的题解页面还发现了一个费用流解法(Solution_ID:4685 by 6755),使人们走较近的路去月球,最后判断最后走过的从月球到汇点的边。但这样一开始就得建很多层图,需要对答案范围的敏锐感知。
    提交记录里时间差异挺大的……有2ms,有几十ms,有像我这样上百ms。

    参考和推荐

  • 相关阅读:
    POJ 3368.Frequent values
    HDOJ 1166.敌兵布阵
    javaWeb之文件下载
    javaWeb之文件上传
    centos系统下忘记了root密码怎么办?
    如何在centos下挂载与卸载磁盘
    验证码生成(java版本)
    javaweb怎么过滤乱码
    mysql修改默认字段大小
    我所知道的命名方式(软件)
  • 原文地址:https://www.cnblogs.com/keshuqi/p/6231367.html
Copyright © 2020-2023  润新知