fsfdgdg

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  5 随笔 :: 0 文章 :: 0 评论 :: 178 阅读

 网络流是图论中一个博大精深的分支。若要详细讲解网络流的各种模型和应用,甚至可以单独占用一章的篇幅。————李煜东《算法竞赛进阶指南》

 一个网络有且仅有一个源点,有且仅有一个汇点。

 对于网络中的每一条边,有一个流量限制,流过这条边的流量不能超过限制,且其边的流量等于其反边的容量。

 对于费用流问题,每一条边有单位费用,这条边的费用等于流过这条边的流量乘以单位费用,且其反边的单位费用等于这条边费用的相反数

 对于网络中的每一个点(除源点和汇点),流进的流量等于流出的流量。

 因此对于一个网络,有如下性质:

 1、f(x,y)=-f(y,x).

 2、每个点流进流量总和=每个点流出流量总和

 3、f(x,y)<=limit(x,y)  

 4、c(x,y)=-c(y,x)

 求解与网络有关问题的算法被称为网络流算法。

 最大流:

 对于一个网络,从源点流向汇点的最大流量是这个网络的最大流。

 增广路算法:

 增广路算法有EK与dinic两种,其中前者是后者的基础,后者是前者的优化。

 两种算法的基础思想是从源点向汇点寻找一条增广路,使得有流量能从源点流向汇点。其中EK基于BFS,每次寻找一条增广路,dinic基于BFS+DFS,每次寻找多条增广路。

 优化:1、当前弧优化:如果一条边已经无法再增广,那么在当次增广中把这条边删除。

    2、同理,如果一个点已经无法再增广,那么在当次增广中把该点删除。

 复杂度:EK上界O(n*m*m),dinic上界(n*n*m)(加入优化),但很难达到上界,一般算法竞赛中,首选dinic;

 预流推进算法:

 预流推进算法是一种非增广路算法,其思想基于若一个点的入流量大于其出流量,则将多出的部分(称为超额流)推送给其他点,又以“高度”来限制推流的顺序。若将连接源点的所有边都初始为满流,经过若干轮推流后(多余的流量推回给源点,汇点不向其他点推流),此时网络里的流量就是网络的最大流。

 复杂度:HLPP上界O(n*n*sqrt(m)),也很难达到上界

 费用流:

 对于一个网络,每条边除了流量限制外,还有一个单位费用。在最大流的前提下最小化费用,就是最小费用最大流。

 算法:

 在增广路算法中,将BFS分层改为SPFA最短路(因为有负边权),再跑dinic或EK;(EK是垃圾)  

 上下界费用流:

 先把每条边设定一个初始流,即每条边的下界,再处理每个点的入出不平衡。通过设定一个虚拟源点和汇点来调节每个点的流量。

 注意:入流量多的应连源点,出流量多的应连汇点。

 为什么?

 因为虚拟源点向虚拟汇点流时,会增加路径上每条边的流量,入流量多的应增加出流量,出流量反之。

 如果是有源汇问题,则从实际汇点向实际源点连容量为INF的边,即使它们“流量守恒”,转化为无源汇问题求解,最后整个网络的流量即是汇点向源点这条边的流量。

 无源汇问题一般只要求求可行流,但有源汇问题还可能要求求最小流或最大流,怎么办?

 最大流:在去除可行流的残量网络上再跑一遍最大流,与之前的可行流叠加即是最大流。

 最小流:在去除可行流的残量网络上跑一遍从汇点到源点的最大流(相当于抵消最多的流量),与之前的可行流叠加即是最小流

posted on   黄傋炒蛋  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示