zoukankan      html  css  js  c++  java
  • 【hjmmm网络流24题补全计划】

    本文食用方式
    按ABC……分层叙述思路
    可以看完一步有思路后自行思考

    飞行员配对问题

    题目链接
    这可能是24题里最水的一道吧。。。
    很显然分成两个集合
    左外籍飞行员 右皇家飞行员
    跑二分图最大匹配
    输入注意:先m后n

    太空飞行计划

    A 本题建模
    将任务和仪器各做一个集合的二分图
    将任务向对应的仪器连边
    B 使用点权
    实验点权为正 仪器点权为负
    C
    首先引入一个概念——最大权闭合图

    在一个图中,我们选取一些点构成集合,记为V,且集合中的出边(即集合中的点的向外连出的弧),
    所指向的终点(弧头)也在V中,则我们称V为闭合图。
    最大权闭合图即在所有闭合图中,集合中点的权值之和最大的V,我们称V为最大权闭合图。
    那么这道题就是要求一个最大权闭合子图

    最大闭合子图解法

    从源点s向每个正权点连一条容量为权值的边,每个负权点向汇点t连一条容量为权值的绝对值的边,有向图原来的边容量全部为无限大。
    求它的最小割,割掉后,与源点s连通的点构成最大权闭合子图,权值为(正权值之和-最小割)
    详见:https://blog.csdn.net/can919/article/details/77603353
    这道题的输入太太太毒瘤QAQ

    最小路径覆盖

    引入概念:简单路——顶点不相交的路
    那么本题就是求无相交点的最小路径覆盖【已经知道啦
    A 拆点
    把点i拆成xi, yi
    B 连边
    当有边(i, j)时 加入一条从xi到yj的边
    C 二分图
    跑最大匹配 ###最小(不相交)路径覆盖 = 点数 - 最大匹配数
    证:原本每个点都可以看作长度为零的路径
    每有一个匹配 都是把一条路径的终点连到另一条路径的起点上
    因为原图是DAG有向无环图 所以最小路径覆盖就减一
    关于路径的输出
    每一个没有被match的点都是最终的终点
    从这些点回溯就能找到整条路经 用栈倒过来就可以了

    魔术球

    传送门

    圆桌聚餐

    一开始在想什么独立集什么的
    但实际上直接跑最大流就行了
    这种思路蒟蒻称为“分流”qvq
    从S向每一个单位连一条容量为该单位人数的边
    从T向每一个桌子连一条容量为该桌最大人数的边
    从每一个单位向每一个桌子连一条容量为一的边
    最大流等于总人数就成立 小于就不成立【显然不会大于啦 从S向外最大流就人数啊
    代码

    最长递增子序列

    题目链接
    A
    很明显第一问就是dp啦
    维护一下序列第1~i项的最长递增子序列长度为f[i]

    B
    然后第二问的建模是酱紫

    • addedge(i + n, i, 1)
    • f[i] = 1 addedge(S, i, 1)
    • f[i] = s addedge(i + n, T, 1)
    • f[i] = 1 && f[j] = s && j > i addedge(i, j + n, 1)

    然后跑一下最大流就好了

    C
    第三问的话 把S到1,n到T,1,n自己之间的边改成inf
    还是跑最大流

    据说这种东西叫分层图?
    代码

    试题库

    这道题相当裸了啊,,

    S ----> 试题种类 ----> 试题号 ----> T
    然后从种类向试题找慢流

    代码

    方格取数

    A
    建图:黑白染色

    B
    引入概念最大点独立集
    也就是说 我们要在原图上选出一个点集
    使得该点集中的点两两不相邻
    当然在二分图中 左边的点和S相连 右边的点和T相连
    点权赋边权
    此时最大流 = 最小点覆盖
    而点权和 - 最小点覆盖 = 最大点独立集

    C
    黑白染色后 黑点连S 白点连T
    相邻的点连边 权为inf
    求最大点独立集

    餐巾问题

    wwwwwcsdn又炸了wwwwqvq又要重新写了
    A
    显然的费用流嘛
    延期问题貌似很麻烦。。
    B
    拆点
    C
    相当喜欢这篇博客

    代码

    软件补丁

    状态压缩 + 最短路
    记得要动态加边 直接建图分分钟炸掉
    代码

    数字梯形

    核心思想:

    • 网络流的边容量可以限制重复
    • 费用流可以解决最值问题
    • 有约束的最值问题可以考虑最大费用流
    • 除了S以外以起点定边权(其实终点也可以 只要别混了就好)

    代码

    运输问题

    这难道不是裸的费用最大流吗。。
    S -- a[i] / 0 --> Ai
    Ai --inf / c(i, j) --> Bi
    Bi -- b[i] / 0 --> T

    代码

    分配问题

    为什么又是一道裸的费用最大流qvq
    S -- 1 / 0 --> Ai
    Ai --inf / c(i, j) --> Bi
    Bi -- 1 / 0 --> T
    代码

    负载平衡

    供求平衡问题用最小费用最大流解决。
    以下转载自hzwer.com

    「建模方法」

    首先求出所有仓库存货量平均值,设第i个仓库的盈余量为A[i],A[i] = 第i个仓库原有存货量 – 平均存货量。建立二分图,把每个仓库抽象为两个节点Xi和Yi。增设附加源S汇T。

    1、如果A[i]>0,从S向Xi连一条容量为A[i],费用为0的有向边。
    2、如果A[i]<0,从Yi向T连一条容量为-A[i],费用为0的有向边。
    3、每个Xi向两个相邻顶点j,从Xi到Xj连接一条容量为无穷大,费用为1的有向边,从Xi到Yj连接一条容量为无穷大,费用为1的有向边。

    求最小费用最大流,最小费用流值就是最少搬运量。

    「建模分析」

    计算出每个仓库的盈余后,可以把问题转化为供求问题。建立供求网络,把二分图X集合中所有节点看做供应节点,Y集合所有节点看做需求节点,在能一次搬运满足供需的Xi和Yj之间连接一条费用为1的有向边,表示搬运一个单位货物费用为1。另外还要在Xi与相邻的Xj之间连接边,表示货物可以暂时搬运过去,不立即满足需求,费用也为1。最大流满足了所有的盈余和亏损供求平衡,最小费用就是最少搬运量。
    代码

    最长 k 可重区间集

    把区间端点离散化
    S -- k/0 --> Afirst
    Ai -- k/0 --> Ai+1
    Aend -- k/0 --> T
    Zl -- 1 / |z| --> Zr

    本题体现的是最大权不相交路径问题,可以用最大费用最大流解决。
    代码

    星际转移

    A
    分层
    B
    把空间站按天数建点连边
    C
    【问题分析】

    分层图网络流问题,枚举答案,构造网络流判定。

    【建模方法】

    首先判断从地球到月球是否存在一条路线,如果不存在那么无解,否则把每个太空站按照每天拆分成d个点,<i,d><i,d>表示第i个站第d天。建立附加源S汇T,顺序枚举答案Day。

    1、对于第Day天,从S到<0,Day><0,Day>连接一条容量为无穷大的有向边。
    2、从<−1,Day><−1,Day>到T连接一条容量为无穷大的有向边。
    3、对于第i个太空船,设第Day-1天在a处,第Day天在b处,从<a,Day−1><a,Day−1>到<b,Day><b,Day>连接一条容量为该太空船容量的有向边。
    4、对于第i个太空站,从<i,Day−1<i,Day−1>到<i,Day><i,Day>连接一条容量为无穷大的有向边。
    5、求当前网络最大流,如果最大流量大于等于地球上人数K,停止枚举,当前Day值就是答案。

    【建模分析】

    我们把网络优化问题转化为枚举答案+可行性判定问题。枚举天数,按天数把图分层,因为乘船每坐一站天数都要增加一,把太空船航线抽象成图中的一条边,跨图的两层。由于太空船容量有限,边上也要加上容量限制。除了坐船以外,人还可以在某个空间站等待下一班太空船的到来,所以每个点要与下一层同一点连接一条容量为无穷的边。这样在层限制的图上求出的网络最大流就是在当前天数以内能够从地面到月球的最多的人数,该人数随天数递增不递减,存在单调性。所以可以枚举答案或二分答案,用网络流判定。网络流判定问题更适合枚举答案,而不是二分,因为新增一些点和边只需要在原有的基础上增广,不必重新求网络流。

    转自KikiDMW

    代码

    孤岛营救问题

    建一个分层图
    状压钥匙,判钥匙是否能过当前边
    主要是建图比较麻烦

    代码

    航空路线问题

    裸的最大费用最大流啊。。
    每个点只能经过一次(除了起点是两次) 那拆点啊
    i -- 1 / 0 --> i + n
    u + n -- 2 / 1 --> v
    主要是输出非常麻烦。。我太菜了

    代码

    汽车加油行驶问题

    虽然这道题很多人说分层图就巴拉巴拉
    但我的思路是从dp上转过来的
    如果你dp的话 要有两个状态吧 位置(横纵坐标其实可以合并)和油数
    还要维护一个值 钱数
    那前一个是裸图 后边那个油数就用分层来解决咯

    代码

    骑士共存问题

    最小顶点覆盖 = 二分图的最大匹配
    最大独立集 = 所有顶点数-最小顶点覆盖
    二分图的最大团 = 补图的最大独立集

    建图的话黑白染色一下 就相邻格子不同颜色即可
    代码

    最长 k 可重线段集问题

    和那道区间的基本没有区别。。这个题意真是。。
    注意一下不能和x轴垂直(自环啊
    玄学处理一下就好了
    代码

    火星探险问题

    深海机器人问题

    这两道题一个点权一个边权
    就拿机器人举例
    只能走一次 权为w的边就是
    u -- 1 / w --> v
    再连一条 u -- inf / 0 --> v
    跑最大流就好了
    火星那道拆一下点即可
    火星代码
    机器人代码

    咦 竟然把这个坑填完了 真好

    附一个特别厉害的传送门

  • 相关阅读:
    TypeError: can't compare offset-naive and offset-aware datetimes bugfix
    pg_restore数据库恢复指令
    第四十期百度技术沙龙笔记整理
    JS事件模型小结
    matlab Newton method
    Markdown 语法的简要规则
    iOS社交分享Twitter、Facebook、拷贝到剪切板、LINE、及邮件
    Linux系统调用过程分析
    iOS自己定义返回button(不影响返回手势)
    MAVEN项目模块化
  • 原文地址:https://www.cnblogs.com/hjmmm/p/9996014.html
Copyright © 2011-2022 走看看