Dinic算法----最大流常用算法之一

——没有什么是一个BFS或一个DFS解决不了的;如果有,那就两个一起。

最大流的$EK$算法虽然简单,但时间复杂度是$O(nm^2)$,在竞赛中不太常用。

竞赛中常用的$Dinic$算法和$SAP$,其实也不太难。

那么,$Dinic$算法到底是什么呢?


 

多路增广

$Dinic$算法最核心的内容就是多路增广

沿着$EK$算法的过程:

我们有一个图,如图一。

按照套路,我们先$BFS$,找$S-T$最短路。所有的距离标号都画在了图二上($EK$算法可能用不到,但$Dinic$用得到)。

假设我们选的是$S-3-T$这条路,增广。。。(如图三,绿色)

然后我们再来一遍$BFS$。。。 等等!

细心的你可能也发现了,$S-1-T$也是一条$S-T$最短路。

那就增广吧!(如图四)

您可以检查一下,这时候没有长度为$2$的最短路了。

但EK算法不会这样。它会再笨拙地$BFS$一遍,这就浪费了不少时间。

所以说,多路增广是很重要的。

 

我们换一种思路,如果网络流在一个$DAG$上,还不用考虑回退边,你会怎么做?

这很简单,$dfs$就能解决。

至于回退边。。。再来一次$BFS-DFS$就好了啊。

还有一个优化:当前弧优化:

对于每个点,我可能在一次$BFS$之后$DFS$多次。那么它出发的边所到的点里, 有些点出发已经满流。

这样, 我就可以每个点记录一个当前弧, 表示这次$DFS$它最后$DFS$到哪条弧,下次$DFS$它的时候就从这条弧开始。

这样,我就可以保证每条边在一次$DFS$中满流后不会再遍历。

这样的复杂度。。。理论上最坏是$O(n^2m)$,但这上界很松。

附代码!

 1 int n;
 2 
 3 struct Dinic{
 4     struct Edge{
 5         int from, to;
 6         LL cap, flow;
 7         Edge(int f = -1, int t = -1, LL c = 0)
 8         :from(f), to(t), cap(c), flow(0)
 9         {}
10     }edges[MAXM];
11     int next[MAXM], cnt;
12     int pre[MAXN], dis[MAXN];
13     int cur[MAXN];                                    //当前弧
14     Dinic()
15     {
16         memset(pre, -1, sizeof(pre));
17         cnt = 0;
18     }
19     void addedge(int f, int t, LL c)
20     {
21         edges[cnt] = Edge(f, t, c);
22         next[cnt] = pre[f];
23         pre[f] = cnt++;
24         edges[cnt] = Edge(t, f, 0);
25         next[cnt] = pre[t];
26         pre[t] = cnt++;
27     } 
28     queue<int> Q;
29     bool BFS(int s, int t)
30     {
31         while(!Q.empty()) Q.pop();
32         memset(dis, -1, sizeof(dis));
33         dis[s] = 0;
34         Q.push(s);
35         while(!Q.empty())
36         {
37             int u = Q.front(); Q.pop();
38             for(int i = pre[u]; i >= 0; i = next[i]) if(edges[i].cap > edges[i].flow)
39             {
40                 int v = edges[i].to;
41                 if(dis[v] >= 0) continue;
42                 dis[v] = dis[u] + 1;
43                 if(v == t) return true;
44                 Q.push(v);
45             }
46         }
47         return false;
48     }
49     LL DFS(int now, int t, LL maxflow)            //当前在now,汇点t
50     {                                             //最大可以提供maxflow的流量 
51         if(now == t) return maxflow;
52         int ret = 0;
53         for(int i = cur[now] != -1 ? cur[now] : pre[now]; i >= 0; i = next[i]) if(edges[i].cap > edges[i].flow) 
54         {
55             int v = edges[i].to;
56             if(dis[v] != dis[now] + 1) continue;
57             int l = DFS(v, t, min(edges[i].cap - edges[i].flow, maxflow - ret));
58             ret += l;
59             edges[i].flow += l;
60             edges[i^1].flow -= l;
61             cur[now] = i;
62             if(ret == maxflow) return ret;
63         }
64         cur[now] = -2;
65         return ret;
66     }
67     LL solve(int s, int t)
68     {
69         int res = 0;
70         while(BFS(s,t)) 
71         {
72             memset(cur, -1, n * sizeof(int));
73             res += DFS(s, t, inf);
74         }
75         return res;
76     }
77 };
Dinic

 

代码可能有错,烦请指出。谢谢。

另外,如果有人知道些好用的画图软件麻烦推荐一下。用windows自带画图太累了。

转载于:https://www.cnblogs.com/y-clever/p/6308820.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascript学习笔记 null和undefined

null是javascript语言的关键字&#xff0c;它表示一个特殊值&#xff0c;常用来描述“空值”。对null执行typeof预算&#xff0c;结果返回字符串“object”&#xff0c;也就是说&#xff0c;可以将null认为是一个特殊的对象值&#xff0c;含义是“非对象”。但实际上&#xff0…

C# 为什么高手都是用IsNullOrWhiteSpace对字符串判空?

判断字符串为空有好几种方法&#xff1a;方法一&#xff1a; 代码如下&#xff1a;static void Main(string[] args){string str "";if (str ""){Console.WriteLine("a is empty"); ;}Console.ReadKey();}运行结果&#xff1a;a is empty这样…

Blazor University (51)依赖注入 —— 拥有多个依赖项:错误的方式

原文链接&#xff1a;https://blazor-university.com/dependency-injection/component-scoped-dependencies/owning-multiple-dependencies-the-wrong-way/拥有多个依赖项&#xff1a;错误的方式OwningComponentBase[1] 类是一个合适的解决方案&#xff0c;当我们需要我们的组件…

Centos 7 搭建.net web项目

现在的.NET Core 1.0版本是一个很小的核心&#xff0c;APIs和工具也并不完整&#xff0c;但是随着.Net Core的不断完善&#xff0c;补充的Apis和创新也会一起整合到.NET Framework中。 安装centos系统 请自行安装或百度教程 安装 libicu包 和 dotnet 温馨提示&#xff1a;如果需…

IDEA 快捷注释

1. 新建类的注释模板 1) File->settings->Editor->Live Templates 2) 点击绿色号&#xff0c;选择template group &#xff0c;输入group的name&#xff0c;然后点ok 3) 选中刚才添加的group,点击号,选择live Template 4) 代码模板位置,个人用的代码: 1 /** 2 * &…

matlab 如何hidden,Matlab基本函数-hidden函数

1、hidden函数&#xff1a;设置或取消隐藏线模式2、用法说明(1)hidden on 函数对当前图形打开隐藏线条删除&#xff0c;使网格图后面的线条被前面的线条遮住。设置曲面图形对象的属性FaceColor为坐标轴背景颜色&#xff1b;(2)hidden off 函数对当前图形关闭隐藏线条删除&#…

异常处理,究竟是处理什么

“系统中每行代码&#xff0c;都应该是有意义的&#xff0c;如果一段代码可有可无&#xff0c;那它就不应该存在。”01—内容简述异常处理是软件开发的必备技能&#xff0c;但“异常处理&#xff0c;究竟是处理什么&#xff1f;”&#xff0c;很多小伙伴并没有一个清晰的认识&a…

第十一篇:(顺序)容器的好伴侣 --- 容器适配器

前言 vector容器的数据结构原型是顺序表&#xff0c;它很好的实现了顺序表的功能&#xff0c;大大方便了编程。好了&#xff0c;现在假设有天我又想用栈&#xff0c;那么有没有栈对应的容器呢&#xff1f;很遗憾&#xff0c;木有。但基于“栈”可以由顺序表或者链表实现这一特性…

第一季度ADC市场份额揭榜 A10 Networks再获用户青睐

近日&#xff0c;根据全球知名咨询公司IDC 发布的2018年第一季度中国ADC市场分析报告显示&#xff0c;A10 Networks 稳占中国ADC市场份额第二名。数据来源&#xff1a;IDC 2018年Q1 ADC市场报告 从厂商排名来看依次为 F5 30%, A10Networks 12%, DPtech 12% ,Sangfor 9% &#…

利用linux shell自己主动顶贴

在论坛上面发帖问个什么东西的话&#xff0c;一旦不顶。帖子就秒沉了&#xff0c;可是又实在不想每时每刻都去顶&#xff0c;怎么办&#xff1f;以下展示了怎样利用shell 的crontab实现自己主动顶贴。 闲话不多说了&#xff0c;以豆瓣为例—– 1&#xff1a; 用chrome打开豆瓣…

深度学习库 SynapseML for .NET 发布0.1 版本

2021年11月 微软开源一款简单的、多语言的、大规模并行的机器学习库 SynapseML&#xff08;以前称为 MMLSpark&#xff09;&#xff0c;以帮助开发人员简化机器学习管道的创建。具体参见[1]微软深度学习库 SynapseML&#xff1a;可直接在系统中嵌入 45 种不同机器学习服务、支持…

支持回调处理 php函数,PHP支持回调的函数有哪些?

PHP支持回调的函数有&#xff1a;1、匿名函数&#xff0c;代码为【$server->on Request】&#xff1b;2、类静态方法&#xff0c;代码为【static function test $req】&#xff1b;3、函数&#xff0c;代码为【my_onRequest $req】。PHP支持回调的函数有&#xff1a;1、匿名…

病毒木马查杀实战第019篇:病毒特征码查杀之编程实现

前言上次我们已经简介过了病毒特征码提取的基本方法&#xff0c;那么这次我们就通过编程来实现对于病毒的特征码查杀。定义特征码存储结构为了简单起见。这次我们使用的是setup.exe以及unpacked.exe这两个病毒样本。经过上次的分析&#xff0c;我们对setup.exe样本的特征码提取…

《ASP.NET Core 6框架揭秘》实例演示[22]:如何承载你的后台服务[补充]

借助 .NET提供的服务承载&#xff08;Hosting&#xff09;系统&#xff0c;我们可以将一个或者多个长时间运行的后台服务寄宿或者承载我们创建的应用中。任何需要在后台长时间运行的操作都可以定义成标准化的服务并利用该系统来承载&#xff0c;ASP.NET Core应用最终也体现为这…

ASP.NET Core MVC压缩样式、脚本及总是复制文件到输出目录

前言 在.NET Core之前对于压缩样式文件和脚本我们可能需要借助第三方工具来进行压缩&#xff0c;但在ASP.NET MVC Core中则无需借助第三方工具来完成&#xff0c;本节我们来看看ASP.NET Core MVC为我们提供了哪些方便。 自动压缩样式和脚本 当我们在测试环境中肯定不需要压缩脚…

京东订单自动评价方法

刚刚完成的一个京东自动订单脚本, 以后还要加入其它京东自动的脚本项目地址: https://github.com/mm333444/aox_jd_auto_script 京东自动完成脚本 目前只完成京东订单自动评价, 评价时会自动上传商品图片 一、安装 1. 程序依赖 python3.52. 安装配置 安装pipenv安装模块 pipenv…

宜建立自主可控的车用芯片和操作系统技术体系

万物互联时代&#xff0c;操作系统的边界在不断突破&#xff0c;面向“人机物”融合的泛在计算场景&#xff0c;能够支撑分布式人机物协同应用的操作系统将是产业未来之光。操作系统在经过主机时代、PC互联时代、移动互联时代之后&#xff0c;来到万物互联时代&#xff0c;这恰…

django 用户管理(1)

编辑了前端的页面展示&#xff0c;用的bootstrap 用户登录 用户信息 用户编辑 创建用户 修改密码 转载于:https://blog.51cto.com/jacksoner/2133129

qiaoye.php,全自动无限生成关键词页面(黑帽SEO优化终极方法)

如果你是做黑帽SEO的&#xff0c;如果你还停留在用栏目、租域名、劫持等手段来做黑帽SEO优化&#xff0c;我可以肯定的告诉你&#xff0c;你做的再好&#xff0c;也赚不了多少。那么今天咱们要说的就是无限生成关键词页面用内容页来做黑帽SEO优化。这是我在演示的时候做的一个站…

v1.0.25 新版发布及Smart Meetup重新开启丨SmartIDE

作者&#xff1a;徐磊文章首发地址&#xff1a;https://smartide.cn/zh/blog/2022-0892-sprint25/关于SmartIDESmartIDE是一群开发者为所有开发者开发的开源云原生IDE&#xff0c;我们的使命是“为开发者赋予云原生的超能力”&#xff01;使用SmartIDE你只需要学会一个简单的指…