最大流 Dinic + Sap 模板
不说别的,直接上模板。
Dinic+当前弧优化:
- struct Edge{
- int x,y,c,ne;
- }e[M*];
- int be[N],all;
- int d[N],q[N];
- int stack[N],top;//栈存的是边
- int cur[N];//当前弧优化
- void add(int x, int y, int z)//需保证相反边第一个为偶数
- {
- e[all].x=x; e[all].y=y; e[all].c=z;
- e[all].ne=be[x];
- be[x]=all++;
- e[all].x=y; e[all].y=x; e[all].c=;
- e[all].ne=be[y];
- be[y]=all++;
- }
- bool BFS(int s, int t)//化为层次图 使得边数从m降低为n 复杂度随之下降
- {
- memset(d,-,sizeof(d));
- int head=,tail=;
- q[++tail]=s;
- d[s]=;
- while(head!=tail)
- {
- int u=q[++head];
- for(int i=be[u]; i!=-; i=e[i].ne)
- if(e[i].c> && d[e[i].y]==-){
- d[e[i].y]=d[u]+;
- q[++tail]=e[i].y;
- if(tail==N-) tail=;
- if(e[i].y==t) return ;
- }
- }
- return ;
- }
- int Dinic(int s, int t)//防止爆栈 用stack模拟递归
- {
- int ans=;
- while(BFS(s,t))
- {
- memcpy(cur,be,sizeof(be));
- int u=s;
- top=;//dfs开始 清空栈
- while()
- {
- if(u==t)
- {
- int minc=,mini;
- for(int i=; i<top; i++)
- if(minc>e[stack[i]].c)
- {
- minc=e[stack[i]].c;
- mini=i;//以便之后回到这继续增广
- }
- for(int i=; i<top; i++)
- {
- e[stack[i]].c-=minc;
- e[stack[i]^].c+=minc;//第一个二进制取反 即取相反边
- }
- ans+=minc;
- top=mini;
- u=e[stack[mini]].x;
- }
- for(int i=cur[u]; i!=-; cur[u]=i=e[cur[u]].ne)
- if(e[i].c> && d[e[i].y]==d[e[i].x]+) break;
- if(cur[u]!=-)
- {
- stack[top++]=cur[u];
- u=e[cur[u]].y;
- }else
- {
- if(top==) break; //循环结束标志
- d[u]=-;//当前节点不在增广路中 删除
- u=e[stack[--top]].x;//回溯
- }
- }
- }
- return ans;
- }
ISAP+GAP+当前弧优化:
- struct Edge{
- int x,y,c,ne;
- }e[M*];
- int x,y,z,n,m,s,t;
- int be[N],all;
- int d[N],q[N];
- int stack[N];//模拟递归
- int gap[N],cur[N];//gap优化+当前弧优化
- void add(int x, int y, int z)//保证第一个为偶数
- {
- e[all].x=x; e[all].y=y; e[all].c=z;
- e[all].ne=be[x];
- be[x]=all++;
- e[all].x=y; e[all].y=x; e[all].c=;
- e[all].ne=be[y];
- be[y]=all++;
- }
- void BFS(int s, int t)
- {
- memset(d,-,sizeof(d));
- memset(gap,,sizeof(gap));
- gap[]=;
- int head=,tail=;
- q[++tail]=t;
- d[t]=;
- while(head!=tail)
- {
- int u=q[++head];
- for(int i=be[u]; i!=-; i=e[i].ne)
- if(d[e[i].y]==-)
- {
- d[e[i].y]=d[u]+;
- q[++tail]=e[i].y;
- gap[d[e[i].y]]++;
- }
- }
- }
- int sap(int s, int t, int n)
- {
- int ans=;
- BFS(s,t);
- memcpy(cur,be,sizeof(be));
- int top=;
- int u=s;
- while(d[s]<n)
- {
- if(u==t)
- {
- int minc=,mini;
- for(int i=; i<top; i++)
- if(minc>e[stack[i]].c)
- {
- minc=e[stack[i]].c;
- mini=i;
- }
- for(int i=; i<top; i++)
- {
- e[stack[i]].c-=minc;
- e[stack[i]^].c+=minc;
- }
- ans+=minc;
- top=mini;
- u=e[stack[mini]].x;
- continue;
- }
- for(int i=cur[u]; i!=-; cur[u]=i=e[i].ne)//当前弧优化
- if(e[i].c> && d[e[i].y]+==d[u]) break;
- if(cur[u]!=-)
- {
- stack[top++]=cur[u];
- u=e[cur[u]].y;
- }else
- {
- int mind=n;
- for(int i=be[u]; i!=-; i=e[i].ne)//更新距离标号
- if(e[i].c> && mind>d[e[i].y])
- {
- mind=d[e[i].y];
- cur[u]=i;
- }
- gap[d[u]]--;
- if(!gap[d[u]]) return ans;//gap表示当前距离的点有多少个 一旦==0 说明断层直接退出循环
- d[u]=mind+;
- gap[d[u]]++;
- if(u!=s) u=e[stack[--top]].x;
- }
- }
- return ans;
- }
- void init()
- {
- all=;
- memset(be,-,sizeof(be));
- }
最大流 Dinic + Sap 模板的更多相关文章
- POJ 3469.Dual Core CPU 最大流dinic算法模板
Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 24830 Accepted: 10756 ...
- (网络流 最大流 Dinic || SAP)Control -- hdu --4289
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4289 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- 求最大流dinic算法模板
//最短增广路,Dinic算法 struct Edge { int from,to,cap,flow; };//弧度 void AddEdge(int from,int to,int cap) //增 ...
- poj 1273最大流dinic算法模板
#include<stdio.h> #include<string.h> #define N 300 #define inf 0x7fffffff #include<qu ...
- 最大流Dinic(模板)
#define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupp ...
- 最大流Dinic算法模板(pascal)
program rrr(input,output); const inf=; type pointer=^nodetype; nodetype=record t,c:longint; next,rev ...
- HDU1532最大流 Edmonds-Karp,Dinic算法 模板
Drainage Ditches Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- hdu 4280 最大流 sap模板
给你岛的坐标求最西边到最东边的最大流 /* 最大流模板 sap */ #include<stdio.h> #include<string.h> #include<algo ...
- POJ 1815 - Friendship - [拆点最大流求最小点割集][暴力枚举求升序割点] - [Dinic算法模板 - 邻接矩阵型]
妖怪题目,做到现在:2017/8/19 - 1:41…… 不过想想还是值得的,至少邻接矩阵型的Dinic算法模板get√ 题目链接:http://poj.org/problem?id=1815 Tim ...
随机推荐
- C# - (0x80040154): Retrieving the COM class factory for component with CLSID {877AA945-1CB2-411C-ACD7-C70B1F9E2E32} failed
1. Exeption Error: System.Runtime.InteropServices.COMException (0x80040154): Retrieving the COM clas ...
- CSS3展现精彩的动画效果 css3的动画属性
热火朝天的css3无疑吸引了很多前端开发者的眼球,然而在css3中的动画属性则是新功能中的主打招牌,说到css3的动画属性不得不让人想起这三个属性:Transform﹑Transition﹑Anima ...
- 30个实用的Linux find命令示例
除了在一个目录结构下查找文件这种基本的操作,你还可以用find命令实现一些实用的操作,使你的命令行之旅更加简易. 本文将介绍15种无论是于新手还是老鸟都非常有用的Linux find命令. 首先,在你 ...
- ELF
http://www.360doc.com/content/11/0826/13/7588214_143424472.shtml 链接,装载都是基于数据结构ELF.
- PAT-乙级-1050. 螺旋矩阵(25)
1050. 螺旋矩阵(25) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求将给定的N个正整数按非递增的 ...
- OpenLDAP配置信息记录
随着各种研发工具使用越来越多,单独为每个工具维护一个账号系统的开销越来越大,而且作为用户多个账号密码使用也越来越不方便.所以需要做一个统一账号登陆. 查询了多个方法,又因为之前用过LDAP,所以选择了 ...
- $('li','div') $('div li') $('div li')
$('div','li')是$(子,父),是从父节点里找子,而不是找li外面的div $('div , li')才是找所有的div和li,之间不存在父子关系 $('div li') 是找div里面所有 ...
- Capsule:开源的 JVM 应用部署工具
[编者按]本文作者 Ron Pressler 是 Parallel Universe 公司的创始人,拥有着丰富的高性能开发经验.通过这篇文章,Ron 向大家详细介绍了全新的开源 JVM 部署工具--C ...
- Chp5: Bit Manipulation
Bits Facts and Tricks x ^ 0s = x x & 0s = 0 x | 0s = x x ^ 1s = ~x x & 1s = x x | 1s = 1s ...
- Public, Private and Protect
public 意味着在其后声明的所有成员对所有的人都可以取. private 意味着除了该类型的创建者和类的内部成员函数之外,任何人都不能存取这些成员. protect 它与private基本相似,只 ...