「模板」网络最大流 FF && EK && Dinic && SAP && ISAP
<题目链接>
话不多说上代码。
Ford-Fulkerson(FF)
#include <algorithm>
#include <climits>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN=100010,MAXM=200010;
bool vis[MAXN];
int n,m,S,T,cnt,ans,head[MAXN];
struct edge
{
int nxt,to,w;
}e[MAXM];
void AddEdge(int x,int y,int w)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
e[cnt].w=w;
head[x]=cnt;
}
void AddEdges(int x,int y,int w)
{
AddEdge(x,y,w);
AddEdge(y,x,0);
}
int DFS(int x,int k)
{
if(x==T)
return k;
vis[x]=1;
for(int i=head[x],t,f;i;i=e[i].nxt)
if(!vis[t=e[i].to] && e[i].w && (f=DFS(t,min(k,e[i].w))))
{
e[i].w-=f;
e[((i-1)^1)+1].w+=f;
return f;
}
return 0;
}
void FF()
{
int f;
while(memset(vis,0,sizeof vis),f=DFS(S,INT_MAX))
ans+=f;
while(0,1)
printf("233");
while(1)
{
memset(vis,0,sizeof vis);
f=DFS(S,INT_MAX);
if(!f)
break;
ans+=f;
}
}
int main(int argc,char *argv[])
{
scanf("%d %d %d %d",&n,&m,&S,&T);
for(int i=1,x,y,w;i<=m;++i)
{
scanf("%d %d %d",&x,&y,&w);
AddEdges(x,y,w);
}
FF();
printf("%d\n",ans);
return 0;
}
Edmonds-Karp(EK)
#include <algorithm>
#include <climits>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN=10010,MAXM=200010;
int n,m,S,T,cnt,ans,head[MAXN],flow[MAXN],pre[MAXN],pre_e[MAXN];
struct edge
{
int nxt,to,w;
}e[MAXM];
void AddEdge(int x,int y,int w)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
e[cnt].w=w;
head[x]=cnt;
}
void AddEdges(int x,int y,int w)
{
AddEdge(x,y,w);
AddEdge(y,x,0);
}
bool BFS(int S)
{
queue<int> q;
memset(flow,0x7f,sizeof flow);
memset(pre,0,sizeof pre);
memset(pre_e,0,sizeof pre_e);
q.push(S);
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=head[x],t;i;i=e[i].nxt)
if(!pre[t=e[i].to] && e[i].w)
{
q.push(t);
pre[t]=x;
pre_e[t]=i;
flow[t]=min(flow[x],e[i].w);
}
if(pre[T])
return 1;
}
return 0;
}
void EK()
{
while(BFS(S))
{
for(int i=T,t;i!=S;i=pre[i])
{
e[t=pre_e[i]].w-=flow[T];
e[((t-1)^1)+1].w+=flow[T];
}
ans+=flow[T];
}
}
int main(int argc,char *argv[])
{
scanf("%d %d %d %d",&n,&m,&S,&T);
for(int i=1,x,y,w;i<=m;++i)
{
scanf("%d %d %d",&x,&y,&w);
AddEdges(x,y,w);
}
EK();
printf("%d",ans);
return 0;
}
Dinic
#include <algorithm>
#include <climits>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN=10010,MAXM=200010;
bool vis[MAXN];
int n,m,S,T,cnt,ans,head[MAXN],dis[MAXN],cur[MAXN];
struct edge
{
int nxt,to,w;
}e[MAXM];
void AddEdge(int x,int y,int w)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
e[cnt].w=w;
head[x]=cnt;
}
void AddEdges(int x,int y,int w)
{
AddEdge(x,y,w);
AddEdge(y,x,0);
}
bool BFS(int S)
{
queue<int> q;
memset(dis,0,sizeof dis);
vis[S]=1;
q.push(S);
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=head[x],t;i;i=e[i].nxt)
if(!vis[t=e[i].to] && e[i].w)
{
vis[t]=1;
q.push(t);
dis[t]=dis[x]+1;
}
if(dis[T])
return 1;
}
return 0;
}
int DFS(int x,int k)
{
if(x==T)
return k;
for(int i=cur[x],t,f;i;i=e[i].nxt)
if(dis[t=e[i].to]==dis[x]+1 && e[i].w && (f=DFS(t,min(k,e[i].w))))
{
e[i].w-=f;
e[((i-1)^1)+1].w+=f;
cur[x]=i;
return f;
}
return 0;
}
void Dinic()
{
int f;
while(memset(vis,0,sizeof vis),BFS(S))
while(memcpy(cur,head,sizeof head),f=DFS(S,INT_MAX))
ans+=f;
}
int main(int argc,char *argv[])
{
scanf("%d %d %d %d",&n,&m,&S,&T);
for(int i=1,x,y,w;i<=m;++i)
{
scanf("%d %d %d",&x,&y,&w);
AddEdges(x,y,w);
}
Dinic();
printf("%d",ans);
return 0;
}
Shortest Augmenting Path(SAP)
#include <algorithm>
#include <climits>
#include <cstdio>
#include <queue>
using namespace std;
const int MAXN=10010,MAXM=200010;
bool vis[MAXN];
int n,m,S,T,cnt,ans,head[MAXN],cur[MAXN],pre[MAXN],pre_e[MAXN],dis[MAXN],gap[MAXN];
struct edge
{
int nxt,to,w;
}e[MAXM];
void AddEdge(int x,int y,int w)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
e[cnt].w=w;
head[x]=cur[x]=cnt;
}
void AddEdges(int x,int y,int w)
{
AddEdge(x,y,w);
AddEdge(y,x,0);
}
void BFS(int T)
{
queue<int> q;
q.push(T);
vis[T]=1;
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=head[x],t;i;i=e[i].nxt)
if(!dis[t=e[i].to] && !e[i].w)
{
vis[t]=1;
dis[t]=dis[x]+1;
q.push(t);
}
}
}
int Flow()
{
int f=INT_MAX;
for(int i=T;i!=S;i=pre[i])
f=min(f,e[pre_e[i]].w);
for(int i=T,t;i!=S;i=pre[i])
{
e[t=pre_e[i]].w-=f;
e[((t-1)^1)+1].w+=f;
}
return f;
}
void SAP()
{
BFS(T);
for(int i=1;i<=n;++i)
++gap[dis[i]];
int x=S;
while(dis[S]<n)
{
if(x==T)
{
ans+=Flow();
x=S;
}
bool flag=0;
for(int i=cur[x],t;i;i=e[i].nxt)
if(e[i].w && dis[x]==dis[t=e[i].to]+1)
{
flag=1;
pre[t]=x;
pre_e[t]=cur[x]=i;
x=t;
break;
}
if(!flag)
{
if(!--gap[dis[x]])
break;
int f=n-1;
for(int i=head[x];i;i=e[i].nxt)
if(e[i].w)
f=min(f,dis[e[i].to]);
++gap[dis[x]=f+1];
cur[x]=head[x];
if(x!=S)
x=pre[x];
}
}
}
int main(int argc,char *argv[])
{
scanf("%d %d %d %d",&n,&m,&S,&T);
for(int i=1,x,y,w;i<=m;++i)
{
scanf("%d %d %d",&x,&y,&w);
AddEdges(x,y,w);
}
SAP();
printf("%d",ans);
return 0;
}
Improved Shortest Augmenting Path(ISAP)
#include <algorithm>
#include <climits>
#include <cstdio>
using namespace std;
const int MAXN=10010,MAXM=200010;
int n,m,S,T,cnt,ans,head[MAXN],cur[MAXN],pre[MAXN],pre_e[MAXN],dis[MAXN],gap[MAXN];
struct edge
{
int nxt,to,w;
}e[MAXM];
void AddEdge(int x,int y,int w)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
e[cnt].w=w;
head[x]=cur[x]=cnt;
}
void AddEdges(int x,int y,int w)
{
AddEdge(x,y,w);
AddEdge(y,x,0);
}
int Flow()
{
int f=INT_MAX;
for(int i=T;i!=S;i=pre[i])
f=min(f,e[pre_e[i]].w);
for(int i=T,t;i!=S;i=pre[i])
{
e[t=pre_e[i]].w-=f;
e[((t-1)^1)+1].w+=f;
}
return f;
}
void ISAP()
{
for(int i=1;i<=n;++i)
++gap[dis[i]];
int x=S;
while(dis[S]<n)
{
if(x==T)
{
ans+=Flow();
x=S;
}
bool flag=0;
for(int i=cur[x],t;i;i=e[i].nxt)
if(e[i].w && dis[x]==dis[t=e[i].to]+1)
{
flag=1;
pre[t]=x;
pre_e[t]=cur[x]=i;
x=t;
break;
}
if(!flag)
{
if(!--gap[dis[x]])
break;
int f=n-1;
for(int i=head[x];i;i=e[i].nxt)
if(e[i].w)
f=min(f,dis[e[i].to]);
++gap[dis[x]=f+1];
cur[x]=head[x];
if(x!=S)
x=pre[x];
}
}
}
int main(int argc,char *argv[])
{
scanf("%d %d %d %d",&n,&m,&S,&T);
for(int i=1,x,y,w;i<=m;++i)
{
scanf("%d %d %d",&x,&y,&w);
AddEdges(x,y,w);
}
ISAP();
printf("%d",ans);
return 0;
}
「模板」网络最大流 FF && EK && Dinic && SAP && ISAP的更多相关文章
- P3376 【模板】网络最大流( Edmonds-krap、Dinic、ISAP 算法)
P3376 [模板]网络最大流( Edmonds-krap.Dinic.ISAP 算法) 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入格式 第一行包含四个正整数N.M.S ...
- 图论算法-网络最大流【EK;Dinic】
图论算法-网络最大流模板[EK;Dinic] EK模板 每次找出增广后残量网络中的最小残量增加流量 const int inf=1e9; int n,m,s,t; struct node{int v, ...
- 【模板】网络最大流(EK、Dinic、ISAP)(网络流)/洛谷P3376
题目链接 https://www.luogu.com.cn/problem/P3376 题目大意 输入格式 第一行包含四个正整数 \(n,m,s,t\),分别表示点的个数.有向边的个数.源点序号.汇点 ...
- 「LuoguP3376」 【模板】网络最大流
题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...
- P3376 【模板】网络最大流(luogu)
P3376 [模板]网络最大流(luogu) 最大流的dinic算法模板(采取了多种优化) 优化 时间 inline+当前弧+炸点+多路增广 174ms no 当前弧 175ms no 炸点 249 ...
- P3376 【模板】网络最大流
P3376 [模板]网络最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点 ...
- 「HNOI2016」网络 解题报告
「HNOI2016」网络 我有一个绝妙的可持久化树套树思路,可惜的是,它的空间是\(n\log^2 n\)的... 注意到对一个询问,我们可以二分答案 然后统计经过这个点大于当前答案的路径条数,如果这 ...
- 「模板」 线段树——区间乘 && 区间加 && 区间求和
「模板」 线段树--区间乘 && 区间加 && 区间求和 原来的代码太恶心了,重贴一遍. #include <cstdio> int n,m; long l ...
- 「模板」 FHQ_Treap 区间翻转
「模板」 FHQ_Treap 区间翻转 没有旋转的 Treap 实现区间操作的功能,很好理解,也很好写,只是速度不算太快. 对于要翻转的区间,把整棵 Treap(存有区间 \([1,n]\) 的信息) ...
随机推荐
- 20172330 2017-2018-1 《Java程序设计》第五周学习总结
20172330 2017-2018-1 <Java程序设计>第五周学习总结 教材学习内容总结 第五章 首先是对各种各种运算符的了解:刚开始以为相等就是=,还有其他一些符号都挺简单的,然后 ...
- oracle数据库之PL/SQL 块结构和组成元素
一.PL/SQL 块 (一)PL/SQL 程序由三个块组成,即声明部分.执行部分.异常处理部分 PL/SQL 块的结构如下: 1.DECLARE /* 声明部分: 在此声明 PL/SQL 用到的变量, ...
- 福大软工1816:Alpha(4/10)
Alpha 冲刺 (4/10) 队名:Jarvis For Chat 组长博客链接 本次作业链接 团队部分 工作情况汇报 张扬(组长) 过去两天完成了哪些任务: 文字/口头描述: 1.将中文分词.词频 ...
- c++设计模式----装饰模式
前言 在实际开发时,你有没有碰到过这种问题:开发一个类,封装了一个对象的核心操作,而这些操作就是客户使用该类时都会去调用的操作:而有一些非核心的操作,可能会使用,也可能不会使用:现在该怎么办呢? 将这 ...
- 软工网络15团队作业4——Alpha阶段敏捷冲刺-2
一.当天站立式会议照片: 二.项目进展 昨天已完成的工作: 微信公众号平台注册"小程序"的账号; 下载微信官方的小程序开发工具,这个是编辑小程序和上传审核小程序必须的工具; 大家一 ...
- 优化mysql的内存
Mysql占用CPU过高的时候,该从哪些方面下手进行优化? 占用CPU过高,可以做如下考虑:1)一般来讲,排除高并发的因素,还是要找到导致你CPU过高的哪几条在执行的SQL,show processl ...
- 【python】使用枚举类
当我们需要定义常量时,一个办法是用大写变量通过整数来定义,例如月份: JAN = 1 FEB = 2 MAR = 3 ... NOV = 11 DEC = 12 好处是简单,缺点是类型是int,并且仍 ...
- 【bzoj2591】[Usaco 2012 Feb]Nearby Cows 树形dp
题目描述 Farmer John has noticed that his cows often move between nearby fields. Taking this into accoun ...
- Devc++编译系统分配给int多少字节
我看的是<C语言程序设计>..谭浩强的PDF版 里面只讲了VC和TC 的,没有Devc++的..(我的是5.10版) 还有这是什么意思? 经过查阅我进行了这样的测试: 得到了这样的结果: ...
- apt-key 命令
学习参照网上教程在容器中搭建nginx时看到apt-key命令不解,记录一下.一下是 --help中的解释. apt-key命令解释: apt-key add <file> - add t ...