网络流Sap算法】的更多相关文章

今天终于学习了网络流..之前一直很怕这类问题,个人觉得网络流算是图论里面最难的了.... sap学习下来感觉一般,关于解法都是意识流,细节也是蛮多的.. 我这里先贴一份模版,自已也加了点注释(只是个人的见解..) int isap(int x,int s)//s表示当前最多可以流多少 { if(x==n) return s;//到终点是直接返回答案 int flow=0,Min=n-1,i;//min最大为n-1 for(i=head[x];i!=-1;i=Next[i]) { int y=to…
递归版sap: #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #define N 310 #define M 50010 #define inf 1<<30 using namespace std; struct Edge{ int to,val,next; }edge[M]; int index[N],d[N],gap[N],e; void a…
GDKOi就快要开始了.没时间打解析,直接上模板. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n,m; struct EDGE { int to,c; EDGE* las; } e[1000001]; int cnt; EDGE* last[1001]; #define rev(x) (e+(int(x-e)^1)) EDGE* cur[1001]…
第一题:按顾客访问猪圈的顺序依次构图(顾客为结点),汇点->第一个顾客->第二个顾客->...->汇点 //第一道网络流 //Ford-Fulkerson //Time:47Ms Memory:276K #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<queue> using namespace std;…
Secret Milking Machine Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8189   Accepted: 2485 Description Farmer John is constructing a new milking machine and wishes to keep it secret as long as possible. He has hidden in it deep within…
首先引入几个新名词: 1.距离标号: 所谓距离标号 ,就是某个点到汇点的最少的弧的数量(即边权值为1时某个点到汇点的最短路径长度). 设点i的标号为level[i],那么如果将满足level[i]=level[j]+1的弧(i,j)叫做允许弧 ,且增广时只走允许弧. 2.断层(本算法的Gap优化思想): gap[i]数组表示距离标号为i的点有多少个,如果到某一点没有符合距离标号的允许弧,那么需要修改距离标号来找到增广路: 如果重标号使得gap数组中原标号数目变为0,则算法结束. SAP算法框架:…
网络流的基本概念跟算法原理我是在以下两篇博客里看懂的,写的非常好. http://www.cnblogs.com/ZJUT-jiangnan/p/3632525.html http://www.cnblogs.com/zsboy/archive/2013/01/27/2878810.html 网络流有四种算法, 包括 Edmond-Karp(简称EK), Ford-Fulkerson(简称FF), dinic算法以及SAP算法. 下面我会写出前三种算法的矩阵跟邻接表的形式, 对于第四种以后有必要…
网络流问题: 我自己理解,在流网络中,在不违背容量限制的条件下,解决各种从源点到汇点的问题. ISAP算法概念: 据说不会有卡ISAP时间的题目---时间复杂度O(E^2*V) 首先原理都是基于不断寻找增广路,属于增广路方法.普通的SAP算法比如EK算法,Dinic 算法,由于在寻找增广路时,都需要先进行BFS,BFS时间复杂度O(E),所以总的时间复杂度最坏情况达到O(VE2). ISAP算法的优化在于距离标号,即每个顶点到达终点 t 的距离.所以可以在遍历的过程中,就建立了一个分层网络,不需…
//网络流SAP模板,复杂度O(N^2*M) //使用前调用init(源点,汇点,图中点的个数),然后调用add_edge()加边 //调用getflow得出最大流 #define N 55 #define M 500500 #define INF 0x3fffff struct Max_Flow { struct node { int to,w,next; }edge[M]; int s,t; int nn; int cnt,pre[N]; int lv[N],gap[N]; void ini…
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的时限居然过了. 其中有个…
poj1273 Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 54962   Accepted: 20960 Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is cov…
网络流嘛,怎么看都是一堆逗逼题嘛,反正遇到还是都做不起嘛.... 网络流的模板非常简单,难点都在于建图,网络流的建图解决问题范围之广,下至A+B Problem,上至单纯形,线性规划.所以如果对于网络流的各种建图方式不熟悉,那么碰到对应的问题肯定完跪. 最大流: 这一部分确实没什么可以说的,你说他考裸的最大流?是不可能滴.考模拟增广路?至少我现在还没有遇到. 最小割: 网络流题目中最难的题目一般都是最小割,最小割建图大概有三种方式. bzoj 3438 小A的作物 描述 小M在MC里开辟了两块巨…
[题意] 给定有向图 G=(V,E).设 P 是 G 的一个简单路(顶点不相交) 的集合.如果 V 中每个顶点恰好在 P 的一条路上,则称 P 是 G 的一个路径覆盖. P 中路径可以从 V 的任何一个顶点开始, 长度也是任意的, 特别地, 可以为 0. G 的最小路径覆盖是 G 的所含路径条数最少的路径覆盖.设计一个有效算法求一个有向无环图 G 的最小路径覆盖. 输入文件示例 input.txt11 121 21 31 42 53 64 75 86 97 108 119 1110 11输出文件…
若有向图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.出了源…
今天自习课没事干,看书自学了一下网络流中的EK算法.(求最大流) 设s为源点,t为汇点,C为容量矩阵,F为流量矩阵,f为最大流量. 1.初始化F,f 2.用BFS在残量网络中找到一条从s到t的最短增广路T,如果T不存在,算法结束. 最短增广路就是最短路径(s→t) 一边(u,v)被增广完后,在残量网络中就不存在(u,v)这条边,只有(v,u)这条边了.(即不存在(u,v)这条路径) 3.m=min(u,v)∈T{C(u,v)-F(u,v)} (最短增广路径中残量网络中最小的边) 4.f+=m 5…
题意: 2 1 1 2 (0,1)20 (1,0)10 (0)15 (1)20 2 1 1 2 表示 共有2个节点,生产能量的点1个,消耗能量的点1个, 传递能量的通道2条:(0,1)20 (1,0)10 代表(起点,终点)最大传递的能量 (0)15 (产生能量的点)产生的最大能量(1)20 (消费能量的点)消费的最大能量 初学网络流,我想从基础练起:就先用EK算法写一遍 这道题看似很难,但其实只要加一个源点以及汇点,让所有的产生能量的点指向源点,让所有的消费能量的点指向汇点: #include…
先推荐一个讲网络流的博客,我的网络流知识均吸收于此   传送门 EdmondsKarp算法基本思想:从起点到终点进行bfs,只要存在路,说明存在增广路径,则取这部分路 权值最小的一部分,即为增广路径(也就是这一部分路的最大流量).然后将这条路上的正向权值都减去min,反向权值都加上min(即,m[i][j]-min,m[j][i]+min,为什么等会再解释).然后重复此操作,最终就得到了最大流. 先上模板(也是取自于刚才的博客,真的写的很精简很好懂). 邻接矩阵版本. #include <que…
转载:网络流基础篇——Edmond-Karp算法             BY纳米黑客 网络流的相关定义: 源点:有n个点,有m条有向边,有一个点很特殊,只出不进,叫做源点. 汇点:另一个点也很特殊,只进不出,叫做汇点. 容量和流量:每条有向边上有两个量,容量和流量,从i到j的容量通常用c[i,j]表示,流量则通常是f[i,j]. 通常可以把这些边想象成道路,流量就是这条道路的车流量,容量就是道路可承受的最大的车流量.很显然的,流量<=容量.而对于每个不是源点和汇点的点来说,可以类比的想象成没有…
网络流是什么类型的问题,看一道题目你就知道了 点击打开链接 . 默认具备图论的基本知识,网络流概念比较多,先看看书熟悉一下那些概念.比较好!一个寄出的网络最大流.EK算法写的. 这是一幅网络,求S  ------>  T   点的最大网络流.  这是初始状态.{a,b}  a 代表该边的最大流量,b代表实际的流量. 一开始,实际流量为0:下面是代码. <pre name="code" class="cpp">#include <cstdio&…
\(EK\)算法的思想就是每一次找一条增广路进行增广. 注意几个点: 存图时\(head\)数组要设为\(-1\). 存图的代码是这样的: inline void add(int u, int v, int w) { ver[tot] = v, fro[tot] = u, edge[tot] = w, nxt[tot] = head[u], head[u] = tot++; ver[tot] = u, fro[tot] = v, edge[tot] = 0, nxt[tot] = head[v]…
Drainage Ditches Problem Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by water for awhile and takes quite a long time to regrow. Thus, Farmer John has…
点击打开链接 Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 20903   Accepted: 10960 Description A power network consists of nodes (power stations, consumers and dispatchers) connected by power transport lines. A node u may be su…
POJ 1273给出M条边,N个点,求源点1到汇点N的最大流量. 本文主要就是附上dinic的模板,供以后参考. #include <iostream> #include <stdio.h> #include <algorithm> #include <queue> #include <string.h> /* POJ 1273 dinic算法模板 边是有向的,而且存在重边,且这里重边不是取MAX,而是累加和 */ using namespace…
网络最大流(dinic) 模型 在一张图中,给定一个源点s,给定汇点t,点之间有一些水管,每条水管有一个容量,经过此水管的水流最大不超过容量,问最大能有多少水从s流到t(s有无限多的水). 解法 dinic算法通过不断寻找增广路的方法得到最大流. 增广路:从源点开始通过一些边到达汇点的边集称为一条增广路. 显然,通过一条增广路的水流是有最小限制的,其就等于增广路上水管最小的通过量. 通过寻找一条条增广路,每次找到后经过的边权都减去最大流量,并将答案加上最大流量,就得到了部分解. 但是部分解不一定…
我的模板 例题: https://vjudge.net/problem/HDU-4280 struct Edge { int lst; int from; int to; int cap; int flow; Edge () { } Edge (int llst, int ffrom, int tto, int ccap, int fflow) : lst(llst), from(from), to(tto), cap(ccap), flow(fflow) { } }; // Dinic 算法有…
例题:  Flow Problem HDU - 3549 Edmonds_Karp算法其实是不断找增广路的过程. 但是在找的过程中是找"最近"的一天增广路, 而不是找最高效的一条增广路, 而且还会重复找, 所以复杂度也是爆表的,很容易被卡. 所以有Dinic和ISAP这两个更加优秀的算法. 我的板子 struct Edge { int lst, from, to, cap, flow; Edge () { } Edge (int ll, int ff, int tt, int cc,…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532 Drainage Ditches Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18864    Accepted Submission(s): 8980 Problem Description Every time it rain…
计算最大流,EK算法模板题. #include <stdio.h> #include <string.h> #include <queue> using namespace std; ; ; <<; int n,m,s,t,cnt,max_flow; int head[maxn],pre[maxn],a[maxn]; struct node { int u; int v; int cap; int next; } edge[maxm]; void init(…
这是09年的多校联赛题目,比10年的难度要大.如果没做过hdu3572,建议先去做.有了解题思维再来做这题. 这题与hdu3572类似.但是1 <= si < ei <= 1,000,000的限制使得我们如果像HDU3572那样建图,会使得边的数量太多.从而超时. 看看别人的题解 http://www.cnblogs.com/wally/archive/2013/05/03/3057066.html  离散化的思想 #include<iostream> #include<…
明天补充~~~先上代码 #include<iostream> #include<string> #include<queue> #include<vector> #include<stack> #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> using namespace std; typedef long…