首页 > 其他分享 >网络流

网络流

时间:2024-10-10 13:01:38浏览次数:5  
标签:一条 容量 增广 text 网络 反悔 算法

最大流

给定一张 \(\text{DAG}\),每条边有一个「容量」\(c\)。你需要找到从 \(S\) 到 \(T\) 的最大流。

FF算法

首先一开始对每条边建立一条容量为 \(0\) 的反向边。

然后每轮执行以下操作:

  1. 在残量网络(即还能流的网络)中找到一条 \(S\) 到 \(T\) 的增广路。
  2. 令 \(w=\) 增广路所有边剩余容量的最小值。则:
  • \(ans+=w\)
  • 增广路上所有边的剩余容量 \(-=w\)
  • 增广路上所有反向边的剩余容量 \(+=w\)

举个典型的例子:

显然,最大流为2,就是上面一条和下面一条。但是我们的程序没有那么聪明,他有可能找出一条这样的路:

此时答案加一,然后进行反悔操作:

然后此时程序又找到了一条经过反向边的增广路,于是答案再加一:

然后就得到了想要的结果,因为这个方案跟我们的方案是本质一样的。

至于原理可以参考匈牙利算法。刚刚的反悔就相当于,寻找一个点的匹配时,是否可以换掉别人的匹配。

比如这张图中,第二条路径本来想要直接从下面到 \(T\),但是那条边的流量已经满了。所以我们让原本在那里的水,沿着中间跨过来的边流回去。这个操作就等价于那个反悔操作。

那么不难看出, \(\text{FF}\) 算法就是一种很正确的带有反悔行为的策略。

不过众所周知,\(\text{DAG}\) 上的 \(\text{dfs}\) 是 \(\text{NP}\) 问题,根本没法跑啊 qwq。

EK算法

在 \(\text{FF}\) 算法上做一个“简单”的优化:每次找一条边数最少的增广路。即把 \(text{dfs}\) 换成了 \(\text{bfs}\)。快了一些!

分析一下时间复杂度。这里引入一个结论:增广总轮数的上界是 \(\mathcal{O}(nm)\)。证明不会qwq。想了解的请至 OI-Wiki

Dinic算法

\(\text{EK}\) 算法每次找增广路都要跑一遍 \(\text{bfs}\),是不是有点浪费了呀。。。毕竟我只想要一条路径。

\(\text{Dinic}\) 算法:用 \(bfs\) 来依次找距离 \(S\) 边数为 \(1,2,3,...,n\) 的点,然后每次走一下增广路。快了一些!

再次分析时间复杂度。还是那个结论,增广总轮数的上界是 \(\mathcal{O}(nm)\)。

标签:一条,容量,增广,text,网络,反悔,算法
From: https://www.cnblogs.com/avalaunch/p/18440490

相关文章

  • 网络最常用的几个命令(arp ,net view,tracert)
    除非了ping常用外,其实命令行,dos命令,还是很多时候可以检查出一个局域网的情况,特别排查问题,找到情况。网络最好用的几个命令arp  显示和修改地址解析协议(ARP)使用的“IP到物理”地址转换表。ARP-sinet_addreth_addr[if_addr]ARP-dinet_addr[if_addr]ARP-a[inet_a......
  • 20222317 2024-2025-1《网络与系统攻防技术》实验一实验报告
    一、实验内容本次实验的对象是一个名为pwn1的linux可执行文件。该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们本次实验将学习两种方法运行这......
  • 20222306 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    1.实验内容1.1本周学习内容①Linux基础知识基本的shell命令(例如:ls、cd、cp、touch、cat、su等等)在Linux中熟练使用编译器gcc、调试器gdb,尤其是gdb调试指令(例如:设置断点break/clear、启用/禁用断点enable/disable、运行程序run、继续运行continue、单步代码跟入函数step、查看......
  • 工控网络损伤问题的解决方案
       工控网络的可靠性和健壮性对于确保系统的无故障运行至关重要,因此网络可靠性的验证必不可少。线路上存在损伤或异常时的系统表现真正的决定了被测系统的可靠性等级。    如果能够提前预知网络系统在某些特定异常存在的情况下的性能表现,就可以在真实的应用环境中快......
  • 假如你从0到1开始学习网络安全,按照这个顺序就对了!
    从零开始学习网络安全是一个系统化的过程,它涉及到多个层面的技术和理论知识。网络安全的学习顺序可以按照由浅入深、逐步递进的原则进行,以下是一个建议的网络安全学习路径:1.基础知识阶段:-计算机网络基础:理解网络架构、TCP/IP协议栈、OSI七层模型、数据链路层到应用层的......
  • 手把手教你学PCIE(6.9)--驱动程序开发实例的网络设备驱动程序开发
    目录1.开发环境准备1.1安装开发工具1.2创建项目目录2.驱动程序代码2.1驱动程序头文件2.2驱动程序主文件3.编译驱动程序4.加载和卸载驱动程序5.测试驱动程序6.总结开发一个网络设备驱动程序是一个复杂的任务,涉及到网络协议栈的集成和硬件设备的管理。在......
  • Linux网络(二)——socket、BIO、epoll原理
    二、内核如何与用户进程协作//创建Socket的c语言程序...intmain(){ intsk=socket(PF_INET,SOCK_STREAM,0); //忽略bind和accept ... } 2.1读取视角:Linuxsocket结构2.1.1socket源码//代码:/include/linux/net.hstructsocket{ socket_state state; shor......
  • YOLO11实战:新颖的多尺度卷积注意力(MSCA)加在网络不同位置的涨点情况 | 创新点如何在自
    ......
  • 20222414 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    实验目的本次实践的对象是一个名为pwn1的linux可执行文件。该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码......
  • #20222309 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    1.实验内容1、直接修改程序机器指令,改变程序执行流程2、通过构造输入参数,造成BOF攻击,改变程序执行流3、注入Shellcode并执行2.实验过程1、直接修改程序机器指令,改变程序执行流程将pwn1改名为pwn20222309-1,并运行打开文件打开文件为乱码按esc键,输入:%!xxd进入十六进制......