最大流 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 ...
随机推荐
- 升级iOS10之后调用摄像头/麦克风等硬件程序崩溃闪退的问题
在升级到iOS10之后, 开发过程中难免会遇到很多的坑, 下面是一些常见的坑, 我做了一些整理, 希望对大家开发有帮助: &1. 调用视频,摄像头, 麦克风,等硬件程序崩溃闪退的问题: 要注意 ...
- 【转载】Ext中关于Ext.QuickTips.init()的使用
免责声明: 本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除. 原文作者:然嗄 原文地址:http://www.cnblogs.com/jia ...
- 针对谷歌默认最小字体12px的正确解决方案 (css、html)
今天晨会,产品要求把以前12px的字体改小一点,我心想这有什么难的,就随口答应了.哪知,改css的时候,谷歌浏览器中font-size小于12px时,字体就不会再缩小了.当时我的第一反应就是会不会是其 ...
- CString向char类型转化 ---“=”: 无法从“wchar_t *”转换为“char *
此文从网上复制过来,原文出处已丢失,望见谅哈 VC 2005中,这个本来很简单的问题又稍微复杂了一点. 在工程里面,一个必不可少的步骤就是把CString转换为shar*字符串.通过 ...
- PHP读取xml之cdata讲解
实例: xss.xml <?xml version="1.0" encoding="UTF-8"?><filters> <f ...
- Linux显示中文乱码解决方法
vi /etc/sysconfig/i18n 将内容改为 LANG="zh_CN.GB18030" LANGUAGE="zh_CN.GB18030:zh_CN.GB231 ...
- OpenLDAP配置信息记录
随着各种研发工具使用越来越多,单独为每个工具维护一个账号系统的开销越来越大,而且作为用户多个账号密码使用也越来越不方便.所以需要做一个统一账号登陆. 查询了多个方法,又因为之前用过LDAP,所以选择了 ...
- POJ 3126 Prime Path(BFS求“最短路”)
题意:给出两个四位数的素数,按如下规则变换,使得将第一位数变换成第二位数的花费最少,输出最少值,否则输出0. 每次只能变换四位数的其中一位数,使得变换后的数也为素数,每次变换都需要1英镑(即使换上的数 ...
- java基础知识回顾之javaIO类--管道流PipedOutputStream和PipedIutputStream
管道流(线程通信流):管道流的主要作用是可以进行两个线程间的通讯,分为管道输出流(PipedOutputStream).管道输入流(PipedInputStream),如果想要进行管道输出,则必须要把 ...
- REST_FRAMEWORK加深记忆-三种CLASS VIEW的进化史
一层一层的封装,又能到底层,就会有全局感啦... from rest_framework import status from rest_framework.response import Respo ...