最大流 SAP 算法伪代码

代码当中是以边的方式存图,邻接矩阵类似。

 1 int dfs(int u, int flow)
 2 {
 3     int tmp, out = 0;
 4     for (int p = fst[u]; p; p = nxt[p]) {
 5         if (w[p] <= 0 || dis[u] != dis[v[p]] + 1)
 6             continue;
 7         w[p] -= tmp = dfs(v[p], min(flow - out, w[p]));
 8         w[p + 1] += tmp;
 9         if ((out += tmp) == flow || dis[u] >= n)
10             return out;
11     }
12     if (dis[u] >= n)
13         return out;
14     if (!--cnt[dis[u]])
15         dis[u] = n;
16     ++cnt[++dis[u]];
17     return out;
18 }
19
20 int main()
21 {
22     /* input */
23
24     while (dis[1] < n)
25         ans += dfs(1, INF_INT);
26     printf("%d\n", ans);
27     return 0;
28 }
时间: 2024-10-27 19:10:46

最大流 SAP 算法伪代码的相关文章

网络流(三)----最大流SAP算法

以  HDU 3572  Task Schedule 为例的模板 Code: #include <cstdio> #include <cstdlib> #include <cstring> #include <cctype> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <stack>

hdu3572Task Schedule 最大流,判断满流 优化的SAP算法

PS:多校联赛的题目质量还是挺高的.建图不会啊,看了题解才会的. 参考博客:http://blog.csdn.net/luyuncheng/article/details/7944417 看了上面博客里的题解,思路就有了.不过建图还是有点麻烦.我把源点设为n+1 (不想从0开始,不修改模版),汇点就是n+2+MAX,其中MAX是题目中Ei的最大值. 这题,我有疑问:优化过的SAP算法的时间复杂度是O(m*n^2),此题的n最大为1000,m为50万,时间超过5亿了.1s的时限居然过了. 其中有个

最大流之sap算法

若有向图G = (V , E)满足下列条件: 1.有且仅有一个顶点S,它的入度为 0 ,这个顶点称为源点. 2.有且仅有一个顶点T,它的出度为 0 ,这个顶点称为汇点. 3.每一条弧都有一个非负数,叫做这条边的容量,边(Vi , Vj)的容量用 Cij 来表示. 则此有向图称为网络流图,记为 G = ( V , E , C) ; 对于网络流图G中,每一条弧( i , j )都给定一个非负数Fij,对于一组数据满足下面三个条件时,称为可行流: 1.对于每条弧都有 Fij < Cij ; 2.出了源

最大流(二)—— SAP算法

直接上代码 #include<vector> #include<cstdio> #include<iostream> #include<cmath> #include<queue> #define numm ch-48 #define pd putchar(' ') #define pn putchar('\n') #define pb push_back #define fi first #define se second #define fr

HDU 3277 Marriage Match III(拆点+二分+最大流SAP)

这个题目是说,有n个女的和男的找伴侣.然后女的具有主动选择权,每个女的可以选自己喜欢的男的,也可以挑选k个不喜欢的男的,做法就是:把女的拆点,u1->u2建立一条容量为k的边.如果遇见喜欢的男生i->j+2*n建一条容量为1的边,否则i+n->j+2*n建一条容量为1的边.最后将源点和女生相连容量为mid,汇点与男生相连容量为mid.枚举mid,看是否会产生满流. 可能姿势不够优美dinic超时了啊,换成SAP快了很多啊... Marriage Match III Time Limit:

最大流ISAP算法模板

这两天学习了最大流,下面是ISAP算法模板: const int inf = 0x3fffffff; template <int N, int M> struct Isap { int top; int d[N], pre[N], cur[N], gap[N]; struct Vertex{ int head; } V[N]; struct Edge{ int v, next; int c, f; } E[M]; void init(){ memset(V, -1, sizeof(V)); t

HDU 3549 Flow Problem ( 最大流 -EK 算法)

C++,G++的读取速度差距也太大了 Flow Problem 题意:n,m表示n个点m条有向带权边 问:从1-n最大流多少 裸最大流,拿来练手,挺不错的 #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <queue> #include <algorithm> const int N = 210; #define

HDU3605Escape(最大流SAP+状态压缩优化点的个数)

Escape Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6239    Accepted Submission(s): 1474 Problem Description 2012 If this is the end of the world how to do? I do not know how. But now scient

最大流 EK算法 (转)

反复寻找源点s到汇点t之间的增广路径,若有,找出增广路径上每一段[容量-流量]的最小值delta,若无,则结束. 在寻找增广路径时,可以用BFS来找,并且更新残留网络的值(涉及到反向边). 而找到delta后,则使最大流值加上delta,更新为当前的最大流值. (粗体表明需要掌握的概念) 关于反向边: 以下摘至HDOJ的课件和网上的: 首先来看一下基本的网络流最大流模型. 有n个点,有m条有向边,有一个点很特殊,只出不进,叫做源点,通常规定为1号点.另一个点也很特殊,只进不出,叫做汇点,通常规定