zoukankan      html  css  js  c++  java
  • 【知识点】网络流常见模型

    最大流:

    1.分配问题:将一些物品分配到若干个点上使得收益之和最大,满足约束。

    建模方式:源点向每个物品连边,每个待分配的点向汇点连边,每个物品向可分配的点连边。

    2.图上问题:在一张图上进行与点或边有关的操作。

    建模方式:每个点拆成入点和出点转成二分图匹配。

    例:最小路径覆盖问题:

    题意:

    给定一张图,求最少能用多少条不相交的路径覆盖所有点。

    题解:

    考虑将每个点u拆成入点$in_u$和出点$out_u$。

    那么对于一条边$(u,v)$,它的作用就是将$out_u$所属的路径与$in_v$所属的路径合并,使得路径数-1。

    由于路径不能相交,所以每个$in_u$只能合并一次,$out_u$同理。

    那么就相当于初始时有n条路径,我们希望用若干条边$(u,v)$减去最多的路径数。

    该数目就等于以$in_u , out_u$为点,以$(out_u , in_v )$为边的二分图最大匹配。

    于是有结论:最小路径覆盖数=总点数-最大匹配数。

    3.棋盘问题:在一个四联通网格图上进行与相邻格有关的操作。

    建模方式:黑白染色转成二分图匹配。

    4.匹配问题:将若干个点两两匹配,满足约束。

    建模方式:二分图匹配+拆点限流。

    例:[CQOI2009]跳舞:

    题意:

    一次舞会有n个男孩和n个女孩。

    每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞。

    每个男孩都不会和同一个女孩跳两首(或更多)舞曲。

    有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”)。

    每个男孩最多只愿意和k个不喜欢的女孩跳舞,而每个女孩也最多只愿意和k个不喜欢的男孩跳舞。

    给出每对男孩女孩是否相互喜欢的信息,舞会最多能有几首舞曲?

    题解:

    考虑二分答案后check。我们可以将一对关系按互相喜欢或互相不喜欢分类。

    将每个男生/女生拆成两个点:开心(与喜欢的人配对)/不开心(与不喜欢的人配对)。

    那么就相当于两张图的二分图匹配,跑出来后与人数$ imes$舞会数比对即可。

    5.时间问题:在问题中加入时间变量。

    建模方式:按时间拆点。

    最小割:

    1.选择问题:选择若干个物品使得收益之和最大(即没选的物品收益之和最小),满足约束。

    建模方式:

    源点向每个物品连边,边权为收益,割掉该边表示不选该物品;

    每个物品向汇点连边,边权为代价,割掉该边表示选该物品;

    物品之间连边,边权和意义视约束而定。

    最终答案=总收益-最小割。

    例:[国家集训队]happiness:

    题意:

    某个班级的座位是一个$n imes m$的矩阵。

    现在所有人要选文科或者理科,每个人选每科有一个喜悦值$a_{i,0/1}$。

    如果某个人和右边/下边的同学选科一样则会获得额外的喜悦值$b_{i,0/1}$。

    求最大的喜悦值总和。

    题解:

    先采用套路建模,源点连边表示选文科,连边汇点表示选理科。

    这题的特殊之处在于需要在两个点割了同一边的边时加上一个价值。

    正难则反,不妨一开始就加上这个价值,然后通过最小割减掉没有产生的价值。

    具体地,源点向每个人连容量为$a_{i,0} + frac{b_{i,0} }{2}$的边,每个人向汇点连容量为$a_{i,1} + frac{b_{i,1} }{2}$的边。

    我们还需要在两个人一个选文一个选理时减掉多余价值,于是对于两个相邻同学连容量为$ frac{b_{i,0} }{2}+ frac{b_{i,1} }{2}$的无向边。

    2.最大权闭合子图:给定一张有向图,求一个权值和最大的点集S,使得S中任意点可达的点都在S内。

    建模方式:

    源点向点权为正的点连边,边权为点权,割掉该边表示不选该点;

    点权为负的点向汇点连边,边权为点权的绝对值,割掉该边表示选该点;

    将原图中的边照搬到新图上,边权为inf。

    最终答案=正点权和-最小割。

    3.割点问题:不是割边而是割点。

    建模方式:每个点拆成入点和出点,割点相当于割掉入点和出点之间的边。

    费用流:

    1.规划问题:合理规划资源使得收益最大。

    建模方式:根据题目而定。

    例:餐巾计划问题:

    题意:

    一个餐厅在相继的n天里,每天需用的餐巾数不尽相同,假设第i天需要$r_i$块餐巾(i=1,2,...,n)。

    餐厅可以购买新的餐巾,每块餐巾的费用为p分;或者把旧餐巾送到快洗部,洗一块需m天,其费用为f分;或者送到慢洗部,洗一块需n天(n>m),其费用为s分(s<f)。

    每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗。

    但是每天洗好的餐巾和购买的新餐巾数之和,要满足当天的需求量。

    试设计一个算法为餐厅合理地安排好n天中餐巾使用计划,使总的花费最小。

    题解:

    考虑上下界网络流,直接按人类思维连边,每天早上到晚上连下界为$r_i$的边,然后跑最小费用可行流就完事了。

    那些在题解里绕着圈地解释上下界网络流模板的老哥们能不能去点一下科技树啊。

    2.最大权不相交路径:给定n个区间,求一个权值和最大的子集S,满足其中任意两个区间均不相交。

    建模方式:

    源点限流为1,向每个区间的左端点连边,每个区间的右端点向汇点连边,费用均为0;

    每个区间的左端点向右端点连费用为权值的边;每个点向右边第一个点连费用为0的边。

    跑最大费用最大流即可。 

    技巧:

    1.求的东西不直接出现在题目条件中(比如时间或者密度)的问题:二分答案后转化为判定。

    例:[SDOI2015]星际战争(最大流),最大密度子图(最小割)。

    2.二分图相关:

    定理1:最大匹配数=最小覆盖数(最小的点集S使得每条边至少有一个端点在点集中)。

    证明:显然直接取最大匹配的每条边的任意一个端点构成的点集就是最小覆盖。

    定理2:最大独立集(最大的点集S使得点集中任意两个点均不联通)=总点数-最小覆盖数。

    证明:更显然了,直接不选最小覆盖的点集就是最大独立集。

    3.增加流量:残量网络上直接跑。

    例:[ZJOI2010]网络扩容。

  • 相关阅读:
    Oracle rownum用法、分页
    Oracle 序列(查询序列的值,修改序列的值)
    Photoshop 更换证件照底色
    Oracle 新建用户、赋予权限
    Oracle-SQL 建表
    SQL decode 函数的用法
    英语词汇800常用20类
    c语言常用排序
    js时间戳总结
    Javascript之编译器
  • 原文地址:https://www.cnblogs.com/YSFAC/p/13206167.html
Copyright © 2011-2022 走看看