<题目链接>

话不多说上代码。

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. 词频统计 SPEC 20170914 1 1 1 1 1

    功能1 小文件输入,为表明程序能跑,结果真实而不是迫害老五,请他亲自键盘在控制台下输入命令. #include<stdio.h> #include<string.h> #inc ...

  2. lintcode-178-图是否是树

    178-图是否是树 给出 n 个节点,标号分别从 0 到 n - 1 并且给出一个 无向 边的列表 (给出每条边的两个顶点), 写一个函数去判断这张`无向`图是否是一棵树 注意事项 你可以假设我们不会 ...

  3. node.js cmd 输入npm-v无反应

    今天安装node,先是提示node版本太低.去官网更新了一下,然后 npm install -g vue-cli 结果出了个"npm ERR! errno -4048" 百度出 这 ...

  4. fcntl函数详解

    功能描述:根据文件描述词来操作文件的特性. 文件控制函数          fcntl -- file control头文件: #include <unistd.h> #include & ...

  5. python爬虫--打开爬取页面

    def requests_view(response): import webbrowser requests_url = response.url base_url = '<head>& ...

  6. C#常见函数

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. Android基础------高级ul:消息对话框

    前言:Android消息对话框提示笔记,刚刚接触Android 1.经典模式 //列表对话框 //经典模式 public void listdialog_01(View view){ final St ...

  8. [OS] 操作系统基本类型

    ·批处理系统:(用户脱机使用.成批处理.多道程序运行) 批处理系统,又名批处理操作系统.批处理是指用户将一批作业提交给操作系统后就不再干预,由操作系统控制它们自动运行.这种采用批量处理作业技术的操作系 ...

  9. [计算机网络-应用层] DNS:因特网的目录服务

    我们知道有两种方式可以识别主机:通过主机名或者IP地址.人们喜欢便于记忆的主机名标识,而路由器则喜欢定长的.有着层次结构的IP地址.为了折中这些不同的偏好,我们需要一种能进行主机名到IP地址转换的目录 ...

  10. iOS-UI控件概述

    IBAction和IBOutlet,UIView 1 @interface ViewController : UIViewController 2 3 @property(nonatomic, wea ...