网络流题目详讲+题单(提高版)(持续更新中......)

标签:图论——网络流
PS:如果你觉得自己还不够强(和我一样弱),可以去入门版看看
阅读体验:https://zybuluo.com/Junlier/note/1248835

写在前面的话(潦草)

  • 这篇博客不会讲定义,理解啊什么的,那些知识点网络上......仅仅是题目详讲
    但是每一道题的题解和知识点还是会涵盖的
  • 笔者还很菜,还有很多不会,只是想让自己会了的题目大家更容易懂
  • 建议使用博客右边的主题切换,换成夜间模式可能看起来更舒服(随性)
  • 笔者根据自己的感受(也有一定参考性的)给题目编了个难度,有主观色彩,可以根据实际需要来选择

前置知识点:

网络流题目详讲(入门版)

题目来了:

PS:若无特殊说明,均为luogu上的题目,难度有标记

网络最大流/一般增广路(Dinic&EK)

  • [X] ☆☆☆最小路径覆盖问题(网络流24题)(其实有些地方把这个模型当板子了......)

    1. 首先需要看懂题目(没错,我看了很久),是让很多条不相交的路径去覆盖所给的图,问最少要多少条并输出它们。
    2. 然后需要证明一个东西:我们一开始把每个点看做一条路径,考虑路径合并的问题,每两条路径首尾相连接起来是不是路径数就会减一?(显然)。而我们会要尽量减少它们的数量。
    3. 想一下怎么可以求出点可以连起来的路径的数量最小值,根据上面2提到的那一点,我们就可以考虑把可以合并的点数全部求出来,再拿总点数去减,是不是就是我们要求的答案了?
      那么问题就转化为了求哪些点可以“合并”。然后再往后看,嗯,标签是网络流,就考虑建图跑吧。
    4. 有了上面的基础应该就不难想了,把每个点分开成两个,X[i]与源点S连容量为1的边,Y[i]与汇点T连容量为1的边(每个点只能在一条路径上),然后数据读入的边X[i] --1--> Y[j]这个毋庸置疑了吧。最后跑Dinic求最大流就行了就行了(我建议把样例的图根据我讲的画出来容易理解,其实不难)
    5. 最后考虑怎么输出路径,很容易想到,在Dinic的DFS过程中可以记录每个点流向的那个点(就是会在原图上相连的点,标记一下每一条“输出边”的开头位置,暴力跳着输出就ok)
      实在不行还是一边看代码吧
  • [X] ☆☆☆☆☆奶牛隐藏(最大流(费用流是错的))

    这道题要讲的话真的太累了,而且不想放图也很难讲懂,所以......(敬请谅解)
    但是相信我,同机房有个神犇Flash Hu巨佬在洛谷里发了一篇题解,讲的贼JB
    这里再提供他的博客地址(打个广告yeh):https://www.cnblogs.com/flashhu/

  • [x] ☆☆☆洛谷 P1344 [USACO4.4]追查坏牛奶

    1. 首先这个题很容易理解,就是求最小割,在满足最小割的基础上使割的边数尽量少
    2. 剩下的就是一个小套路了
      把所有边的容量改成\(c*1001+1\),然后跑一遍最大流最小割
      最小割就是\(Ans/1001\),割的边数就是\(Ans\)%\(1001\)
    3. 为什么这样跑出来就是对的呢
      首先这样改动边的容量的话,任一两条边容量谁大谁小没有改变吧(不等式的性质。。。)
      然后对于\(Ans*1000\)我们可以理解为原来的了流量,\(+1\)可以理解为割掉边造成的流量
    4. 然后这种题今后就可以当网络流简单题了。。。
  • [ ] 最长不下降子序列问题(网络流24题)

费用流

  • [X] ☆☆☆☆☆洞穴遇险

    1. 难度很大,我一开始并不会做,听了zkj的讲解才会做的(我是真的弱)
    2. 首先必须要想尽一切办法把那个三角柱抽象成一条路径(从一个端点进经过转口(支撑部位)再从另一个端点出),抽象完之后会好理解很多......
    3. 一个不需要脑子的地方:我们的三角柱转角肯定放在i+j为奇数的地方
    4. 开始建图:(i+j为奇数简称奇数点,偶数点同理)
      首先,我很不幸地告诉你,这个题目要把点排成四列,而且......我理解了很久才懂
  • 首先奇数点和偶数点肯定是要分开的对吧(毋庸置疑),那么我将会把奇数点和偶数点分别排成两列(先别问为什么,网络流的建边从来没有为什么,都是套路,对了就行)
  • 然后奇数点肯定要拆点(因为会产生贡献,所以要对自己连边),我们把这两列放在四列点的中间两列(说了抽象成路径,奇数点是要在石头的转角处被经过的,路径中间)
  • 偶数点的话 (PS:不管我bb什么,这段话都是偶数点):
    你会发现一个性质:"石头"路径肯定是从一个奇数列(或者偶数列)上的偶数点连到欧数列上的另一个偶数点(奇数点),总之就是起点和终点的列数奇偶不同(yeh,简单明了),所以把奇数列的点放在左边(放右边是一样的),再把偶数列放在右边,我们就强制好了出口和入口(左右是对称的,没有区别)
  • 考虑连边:
    ①首先,上面已经说过了,中间的两列奇数点分别自己对自己连一条流量为1,费用为点权的边
    ②其次,对于所有的偶数点,从源点向第一列每个点连一条流量为1费用为0的边,从第四列向汇点连一条流量为1费用为0的边
    ③最后,相邻的点肯定要连边对吧,从第一列向这个点在图上相邻的点(一定在第二列中的)连容量为1,费用为0的边,第三列向第四列连边也同理

  1. 不用想了,套板子,跑一个最大费用最大流,最后拿所有点的点权之和减掉就是答案了(因为我们求得的是最大覆盖住多少)
  2. 你问我要代码?不行,得让你先经历痛苦,再去看洛谷的题解的代码吧
    (其实就是码的太丑了怕丢人)

预流推进算法(一种新的很吊的求最大流的方法,据说非常优秀)

网络流题目需要注意的地方

PS:代码尚未过编译,现场手打的,有错误请指出
PS:有些凌乱,凑合着看

Part1 一定要记得

1. 建边时的"反边容量0"和"反边费用负"

il void add(rg int p,rg int q,rg int o,rg int w)
{//o为容量,w为费用(变量丑)ljl[++cnt]=(EDGE){q,hd[p],o, w},hd[p]=cnt;ljl[++cnt]=(EDGE){p,hd[q],0,-w},hd[q]=cnt;
}

2. EK算法记录前驱并处理情况的跳点情况

    int flow=Inf;for(int i=T;i!=S;i=ljl[pre[i]^1].to)flow=min(flow,ljl[pre[i]].c);tot+=flow,ans+=flow*dis[T];for(int i=T;i!=S;i=ljl[pre[i]^1].to)ljl[pre[i]].c-=flow,ljl[pre[i]^1].c+=flow;

3. 当前弧优化记得每次都要重新赋值cur

while(BFS())
{for(int i=1;i<=n;++i)cur[i]=hd[i];//<--while(lst res=dfs(1,n,Inf))ans+=res;

4. 跑Dinic分层时dep[S]一定要赋值为1,不然死循环

    Q.push(S),dep[S]=1;//<--

5. 增广路时数组清零(还有数组的边界)

其实边界的话,我一般把S放在0号节点,T放在最后的节点,循环的时候就会顺手很多

    //Dinic的BFSfor(int i=S;i<=T;++i)dep[i]=0;//<--//费用流的SPFAfor(int i=S;i<=T;++i)dis[i]=Inf;//<--跑最大费用则为-Infwhile(!Q.empty())Q.pop();dis[S]=0,Q.push(S),in[S]=1;

6. 费用流和最大流都可以跑环

Part2 技巧

看看xzy吧,很详细的

转载于:https://www.cnblogs.com/cjoierljl/p/9489471.html

网络流题目详讲+题单(提高版)(持续更新中......)相关推荐

  1. 《LeetCode 热题 HOT 100》Java答案汇总版---持续更新中

    <LeetCode 热题 HOT 100>Java答案汇总版-持续更新中 个人认为<LeetCode 热题 HOT 100>中的题目特别适合算法新手进行一个入门的刷题,而且作者 ...

  2. 蓝桥杯基础题 字符串处理(持续更新中)

    目录 标题统计 罗马数字 删除字符 扫雷游戏 潜伏者 ISBN 号码 字符串的展开 FBI树 标题统计 https://www.lanqiao.cn/problems/325/learning/ 题目 ...

  3. CCF CSP认证历年真题 满分代码(持续更新中)

    目标 在接下来的半年到一年时间内,补全CCF认证历年真题(A-D)的满分代码(E题随缘). 考虑到CCF认证这个东西是可以混分的,我计划对D.E题额外增加部分分代码,或许有助于不同层次的选手备赛. 除 ...

  4. 陇东学院计算机组成原理题库 试卷 (持续更新中...)

    祝愿大家今天考试顺利!!!!!60分万岁!!!!! 选择题 第二套 第三套 第四套 第五套 第六套 第七套 填空题 第二套 第三套 第四套 第六套 第七套 第八套 第九套 第十套 判断题 第二套 第三 ...

  5. 成信大807程序综合设计2015-2022历年真题及答案【持续更新中】

    快速导航 2015年 一.填空题 二.程序改错题 三.分析程序题 四.算法设计及编程题 2016年 一.单项选择题 二.判断题 三.程序分析题 四.程序设计题 2017年 一.单项选择题 二.判断题 ...

  6. java面试知识迷你版--持续更新中

    **部分知识来源JavaGuide等网络学习资源. java基础 内部类:静态内部类.成员内部类.局部内部类.匿名内部类. 重写(override)要求子类的返回值小于父类(类型相同),修饰符使用范围 ...

  7. 剑指offer没有java版吗_剑指Offer(Java版) 持续更新中

    面试题2 单例(之前有整理,略) 面试题3 二维数组中的查找 public boolean find(int target, int [][] array) { boolean found = fal ...

  8. 书单推荐(持续更新中)

    书名 推荐级别 理由 解忧杂货店 4星 一个能和过去,和未来通信的杂货店.一个以帮助他人为人生价值的老爷爷.一个个看似毫无关联的小故事,到结局才发现原来都是有因有果.故事很温馨.这种构思也很好.值得一 ...

  9. python解acm题_python ACM ,持续更新中。。。。。。。。。。。。

    python中用print总是会出现回车空格,非常讨厌,然而,Python 3.0下print已经从语句变为函数了,我用的使python2.7.4,所以呢,还不行.....但是我们可以用其他方法: i ...

最新文章

  1. Python 1 数据类型的操作
  2. 【原创】new和delete
  3. 多线程CreateThread函数的用法及注意事项
  4. 为自己写程序之JavsScript代码段测试器
  5. 时间复杂度为m+n,的一种模式匹配,适合子串不是很长的匹配
  6. [转贴]降低网络延迟的方法
  7. mysql三阶段提交实现_基于两阶段提交的分布式事务实现(UP-2PC)
  8. .NET伪静态使用以及和纯静态的区别
  9. 简单使用hibernate(idea中使用)
  10. 常用制图工具Visio-ProcessOn
  11. python pygame实现简单的网游 1
  12. 【知识笔记】Debugging
  13. 苹果电脑(mac os x)键盘使用技巧
  14. 《人,绩效和职业道德》及博客读后感
  15. C语言正余弦函数定点查表算法原理及实现
  16. 地名能否作为商标使用
  17. ubuntu18添加中文输入法
  18. 微信扫码支付notify_url回调接收通知问题
  19. STM32F103C8T6驱动SYN6288语音模块(暂时做到能播放连续语音,其他诸如背景音乐的功能还没做)
  20. 7大车企电动策略,平台化到底是解药还是毒药?

热门文章

  1. php随机产生4乘4矩阵,PHP 用二维矩阵生成一个给定层数的杨辉(PASCAL)三角形
  2. java 文件删除异常 ut_【JAVA-UT】12、抛出了指定的异常吗?
  3. ios调用restful接口_Postman调用https异常解决
  4. java 构造方法和析构方法_PHP面向对象程序设计之构造方法和析构方法详解
  5. c语言程序设计运用,清华大学出版社-图书详情-《C语言程序设计及应用教程》...
  6. 计算机网络的体系结构与协议基本概念,计算机网络技术基础-第3章网络体系结构与协议.ppt...
  7. 【thymeleaf】th:with
  8. JNDI配置DataResource代替JDBC连接数据库
  9. linux scp 跨服务器,scp跨服务器拷贝,后台运行
  10. 验证码加减乘PHP,使用php实现加减法验证码