<题目链接>

话不多说上代码。

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的更多相关文章

  1. P3376 【模板】网络最大流( Edmonds-krap、Dinic、ISAP 算法)

    P3376 [模板]网络最大流( Edmonds-krap.Dinic.ISAP 算法) 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入格式 第一行包含四个正整数N.M.S ...

  2. 图论算法-网络最大流【EK;Dinic】

    图论算法-网络最大流模板[EK;Dinic] EK模板 每次找出增广后残量网络中的最小残量增加流量 const int inf=1e9; int n,m,s,t; struct node{int v, ...

  3. 【模板】网络最大流(EK、Dinic、ISAP)(网络流)/洛谷P3376

    题目链接 https://www.luogu.com.cn/problem/P3376 题目大意 输入格式 第一行包含四个正整数 \(n,m,s,t\),分别表示点的个数.有向边的个数.源点序号.汇点 ...

  4. 「LuoguP3376」 【模板】网络最大流

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...

  5. P3376 【模板】网络最大流(luogu)

    P3376 [模板]网络最大流(luogu) 最大流的dinic算法模板(采取了多种优化) 优化 时间 inline+当前弧+炸点+多路增广 174ms no 当前弧 175ms no 炸点 249 ...

  6. P3376 【模板】网络最大流

    P3376 [模板]网络最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点 ...

  7. 「HNOI2016」网络 解题报告

    「HNOI2016」网络 我有一个绝妙的可持久化树套树思路,可惜的是,它的空间是\(n\log^2 n\)的... 注意到对一个询问,我们可以二分答案 然后统计经过这个点大于当前答案的路径条数,如果这 ...

  8. 「模板」 线段树——区间乘 && 区间加 && 区间求和

    「模板」 线段树--区间乘 && 区间加 && 区间求和 原来的代码太恶心了,重贴一遍. #include <cstdio> int n,m; long l ...

  9. 「模板」 FHQ_Treap 区间翻转

    「模板」 FHQ_Treap 区间翻转 没有旋转的 Treap 实现区间操作的功能,很好理解,也很好写,只是速度不算太快. 对于要翻转的区间,把整棵 Treap(存有区间 \([1,n]\) 的信息) ...

随机推荐

  1. JS中Text节点总结

    文本节点有Text类型表示,包含的是可以找字面解释的纯文本内容.纯文本中可以包含转移后的HTML字符,但不能包含HTML代码.Text节点具有以下属性: 1.nodeType的值为3. 2.nodeN ...

  2. qwe

    这次作业我负责的部分是把爬取完的聊天记录经行数据挖掘以及经行各种普通过滤高级过滤等. 运行截图如下: 数据分为四部分:账户名.qq/邮箱.包含关键词的发言次数.包含关键词的发言字数. 遇到的困难及解决 ...

  3. 项目UML设计(团队)

    [团队信息] 团队项目: 小葵日记--主打记录与分享模式的日记app 队名:日不落战队 队员信息及贡献分比例: 短学号 名 本次作业博客链接 此次作业任务 贡献分配 备注 501 安琪 http:// ...

  4. 关于设置Visaul Studio 2010 代码编辑界面背景的方法

    1.打开代码编辑界面: 2.找到工具--选项: 3.打开选项后选中纯文本--项背景色: 4.点击自定义,找到自己需要的颜色: [注]: “项前景色”即代码的颜色: “项背景色”即背景颜色. 设置好后, ...

  5. Java中的日志——Java.util.logging、log4j、commons-logging

    Java中给项目程序添加log主要有三种方式,一使用JDK中的java.util.logging包,一种是log4j,一种是commons-logging.其中log4j和commons-loggin ...

  6. Delphi处理事件函数中的Sender: TObject代表什么?

    下面这个按钮点击事件中,Sender代表谁? procedure Tsomain.ToolButton1Click(Sender: TObject); 是代表事件的拥有者吗? procedure TF ...

  7. BZOJ 1293 生日礼物(尺取法)

    把坐标离散化之后就是很普通的尺取法啦. # include <cstdio> # include <cstring> # include <cstdlib> # i ...

  8. select模型的原理、优点、缺点

    关于I/O多路复用: I/O多路复用(又被称为“事件驱动”),首先要理解的是,操作系统为你提供了一个功能,当你的某个socket可读或者可写的时候,它可以给你一 个通知.这样当配合非阻塞的socket ...

  9. JS详细图解作用域链与闭包

    JS详细图解作用域链与闭包 攻克闭包难题 初学JavaScript的时候,我在学习闭包上,走了很多弯路.而这次重新回过头来对基础知识进行梳理,要讲清楚闭包,也是一个非常大的挑战. 闭包有多重要?如果你 ...

  10. CentOS 文本搜索grep

    grep 用于在文本中执行关键词搜索, 用法: grep [选项]... PATTERN [FILE]... [root@bigdata-senior01 ~]# grep "ftp&quo ...