算法模板——sap网络最大流 3(递归+邻接表)
时间:2022-05-08
本文章向大家介绍算法模板——sap网络最大流 3(递归+邻接表),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
实现功能:同前
程序还是一如既往的优美,虽然比起邻接矩阵的稍稍长了那么些,不过没关系这是必然,但更重要的一个必然是——速度将是一个质的飞跃^_^(这里面的point指针稍作了些创新——anti指针,这个指向当前弧的反向弧,便于路径增广时的操作,相比非递归里面非要用一个op函数来挨个找已经强多了!!!)
1 type
2 point=^node;
3 node=record
4 g,w:longint;
5 anti,next:point;
6 end;
7 var
8 i,j,k,l,m,n,ans,s,t:longint;
9 a:array[0..10000] of point;
10 d,dv:array[0..10000] of longint;
11 function min(x,y:longint):longint;inline;
12 begin
13 if x<y then min:=x else min:=y;
14 end;
15 procedure add(x,y,z:longint);inline;
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[y]^.anti:=a[x];a[x]^.anti:=a[y];
21 end;
22 function dfs(x,flow:longint):longint;inline;
23 var i,j,k,l:longint;p:point;
24 begin
25 if x=t then exit(flow);
26 dfs:=0;p:=a[x];
27 while p<>nil do
28 begin
29 if (p^.w>0) and (d[x]=(d[p^.g]+1)) then
30 begin
31 k:=dfs(p^.g,min(flow-dfs,p^.w));
32 dec(p^.w,k);
33 inc(p^.anti^.w,k);
34 inc(dfs,k);
35 if dfs=flow then exit;
36 end;
37 p:=p^.next;
38 end;
39 if d[s]=n then exit;
40 dec(dv[d[x]]);
41 if dv[d[x]]=0 then d[s]:=n;
42 inc(d[x]);inc(dv[d[x]]);
43 end;
44 begin
45 readln(n,m,s,t);
46 for i:=1 to n do a[i]:=nil;
47 for i:=1 to m do
48 begin
49 readln(j,k,l);
50 add(j,k,l);
51 end;
52 fillchar(d,sizeof(d),0);
53 fillchar(dv,sizeof(dv),0);
54 dv[0]:=n;ans:=0;
55 while d[s]<n do inc(ans,dfs(s,maxlongint));
56 writeln(ans);
57 end.
- 没有自己的服务器如何学习生物数据分析(上篇)
- 【直播】我的基因组57:最简陋的祖源分析
- asp.net web api 使用Odata
- TensorFlow从0到1丨第十六篇 L2正则化对抗“过拟合”
- TensorFlow从0到1 | 第十七章 Step By Step上手TensorBoard
- C#要点
- MySQL索引背后的数据结构及算法原理
- 生物信息Python从入门到精通
- Entity Framework——建模建库
- asp.net web api 构建api帮助文档
- TensorFlow从0到1 | 第十八章: 升级手记:TensorFlow 1.3.0
- 设计一个可扩展的用户登录系统
- 字符串和编码
- windows service编程
- 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 数组属性和方法
- c++实例之通讯录管理系统之显示菜单和退出功能(一)
- c++实例之通讯录管理系统之添加联系人功能(二)
- c++实例之通讯录管理系统之显示联系人功能(三)
- c++实例之通讯录管理系统之删除联系人功能(四)
- springboot检索之Elasticsearch简介
- c++实例之通讯录管理系统之查找联系人功能(五)
- 【python-leetcode424-滑动窗口法】替换后的最长重复字符
- c++实例之通讯录管理系统之修改联系人功能(六)
- 解决arxiv.org打开pdf缓慢问题
- c++实例之通讯录管理系统之清空联系人功能(七)
- springboot任务之定时任务
- springboot检索之整合elasticsearch并使用jest操作
- springboot任务之邮件任务
- springboot安全之整合spring security实现(只有登录才有权限、不同用户显示不同内容、记住我)
- springboot任务之异步任务