算法模板——Dinic网络最大流 2
时间:2022-05-08
本文章向大家介绍算法模板——Dinic网络最大流 2,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
实现功能:同Dinic网络最大流 1
这个新的想法源于Dinic费用流算法。。。
在费用流算法里面,每次处理一条最短路,是通过spfa的过程中就记录下来,然后顺藤摸瓜处理一路
于是在这个里面我的最大流也采用这种模式,这样子有效避免的递归,防止了爆栈么么哒
1 type
2 point=^node;
3 node=record
4 g,w:longint;
5 next,anti:point;
6 end;
7 var
8 i,j,k,l,m,n,s,t,flow:longint;
9 a,e:array[0..10000] of point;
10 c,d:array[0..10000] of longint;
11 function min(x,y:longint):longint;
12 begin
13 if x<y then min:=x else min:=y;
14 end;
15 procedure add(x,y,z:longint);
16 var p:point;
17 begin
18 new(p);p^.g:=y;p^.w:=z;p^.next:=a[x];a[x]:=p;
19 new(p);p^.g:=x;p^.w:=0;p^.next:=a[y];a[y]:=p;
20 a[x]^.anti:=a[y];a[y]^.anti:=a[x];
21 end;
22 function spfa:boolean;
23 var p:point;f,r:longint;
24 begin
25 fillchar(c,sizeof(c),255);
26 d[1]:=s;f:=1;r:=2;c[s]:=0;
27 while f<r do
28 begin
29 p:=a[d[f]];
30 while p<>nil do
31 begin
32 if (p^.w<>0) and (c[p^.g]=-1) then
33 begin
34 c[p^.g]:=c[d[f]]+1;
35 e[p^.g]:=p;
36 d[r]:=p^.g;inc(r);
37 end;
38 p:=p^.next;
39 end;
40 inc(f);
41 end;
42 exit(c[t]<>-1);
43 end;
44 procedure calc; //“顺藤摸瓜”模式有效避免了递归带来的爆栈隐患
45 begin
46 i:=t;l:=maxlongint;
47 while i<>s do
48 begin
49 l:=min(l,e[i]^.w);
50 i:=e[i]^.anti^.g;
51 end;
52 i:=t;inc(flow,l);
53 while i<>s do
54 begin
55 if e[i]^.w<>maxlongint then dec(e[i]^.w,l);
56 if e[i]^.anti^.w<>maxlongint then inc(e[i]^.anti^.w,l);
57 i:=e[i]^.anti^.g;
58 end;
59 end;
60 begin
61 readln(m,n,s,t);
62 for i:=1 to n do a[i]:=nil;
63 for i:=1 to m do
64 begin
65 readln(j,k,l);
66 add(j,k,l);
67 end;
68 flow:=0;while spfa do calc;
69 writeln(flow);
70 readln;
71 end.
- Modbus RTU驱动程序开发指引
- freeRTOS任务创建
- 洛谷P4213 Sum(杜教筛)
- JVM活学活用——调优工具
- .Net中的AOP系列之构建一个汽车租赁应用(下)
- Zookeeper学习笔记——2 Shell和Java API的使用
- Java基础巩固——反射
- 手把手教你在树莓派上搭建web服务器
- 安装和搭建基于netcore的demo
- 项目心得:广度遍历搜索部门处理业务
- 使用JAVA开发微信公众平台(一)——环境搭建与开发接入
- BZOJ4805: 欧拉函数求和(杜教筛)
- centos7.x下搭建netcore环境和helloworld的demo
- ARM coretex M4 系统定时器
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- R语言中广义线性模型(GLM)中的分布和连接函数分析
- R语言自适应平滑样条回归分析
- R语言区间数据回归分析
- R语言ggsurvplot绘制生存曲线报错 : object of type ‘symbol‘ is not subsettable
- R软件SIR模型网络结构扩散过程模拟
- R语言中使用线性模型、回归决策树自动组合特征因子水平
- R语言缺失值的处理:线性回归模型插补
- R语言如何解决线性混合模型中畸形拟合(Singular fit)的问题
- Android如何在Gradle中更改APK文件名详解
- 面试中常见的 C 语言与 C++ 区别的问题
- Linux系统实现ansible自动化安装配置httpd的方法
- 常用Linux发行版镜像源配置小结
- Linux如何处理文件已删除但空间不释放的问题
- 解析linux或android添加文件系统的属性接口的方法
- linux查看软件的安装位置简单方法