洛谷 P3376 【【模板】网络最大流】
题目描述
如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。
输入
第一行包含四个正整数N、M、S、T,分别表示点的个数、有向边的个数、源点序号、汇点序号。
接下来M行每行包含三个正整数ui、vi、wi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi)
输出
一行,包含一个正整数,即为该网络的最大流。
样例输入
4 5 4 3
4 2 30
4 3 20
2 3 20
2 1 30
1 3 40样例输出
50数据规模:
对于30%的数据:N<=10,M<=25
对于70%的数据:N<=200,M<=1000
对于100%的数据:N<=10000,M<=100000
网络流的模板题。汇总一些增广路算法。(Ford-Fulkerson, Edmond-Karp, Dinic, ISAP)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std; struct edge {
int to,cap,rev;
}; const int maxn=, INF=0x7F7F7F7F;
int n,m;
vector <edge> G[maxn+]; edge make_edge(int to, int cap, int rev) {
edge x;
x.to=to, x.cap=cap, x.rev=rev;
return x;
} void add_edge(int from, int to, int cap) {
G[from].push_back(make_edge(to,cap,G[to].size()));
G[to].push_back(make_edge(from,,G[from].size()-));
} void init() {
for (int i=; i<=m; i++) {
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add_edge(u,v,w);
}
} namespace Ford_Fulkerson {
bool used[maxn+]; int dfs(int x, int t, int f) {
if (x==t) return f;
used[x]=true;
for (int i=; i<G[x].size(); i++) {
edge &e=G[x][i];
if (!used[e.to]&&e.cap>) {
int d=dfs(e.to,t,min(f,e.cap));
if (d>) {
e.cap-=d;
G[e.to][e.rev].cap+=d;
return d;
}
}
}
return ;
} int max_flow(int s, int t) {
int flow=;
for(;;) {
memset(used,,sizeof(used));
int f=dfs(s,t,INF);
if (f==) return flow;
flow+=f;
}
}
} namespace Edmond_Karp {
bool vis[maxn+];
int prev[maxn+];
int pree[maxn+]; void bfs(int s) {
memset(vis,,sizeof(vis));
memset(prev,-,sizeof(prev));
memset(pree,-,sizeof(pree));
queue <int> q;
vis[s]=true;
q.push(s); while(!q.empty()) {
int x=q.front();
q.pop();
for (int i=; i<G[x].size(); i++) {
edge &e=G[x][i];
if (e.cap>&&!vis[e.to]) {
prev[e.to]=x;
pree[e.to]=i;
vis[e.to]=true;
q.push(e.to);
}
}
}
} int max_flow(int s, int t) {
int flow=;
for(;;) {
bfs(s);
if (!vis[t]) return flow;
int d=INF;
for (int i=t; prev[i]!=-; i=prev[i])
d=min(d,G[prev[i]][pree[i]].cap);
for (int i=t; prev[i]!=-; i=prev[i]) {
edge &e=G[prev[i]][pree[i]];
e.cap-=d;
G[e.to][e.rev].cap+=d;
}
flow+=d;
}
}
} namespace Dinic {
int level[maxn+];
int iter[maxn+]; void bfs(int s) {
memset(level,-,sizeof(level));
queue <int> q;
level[s]=;
q.push(s); while (!q.empty()) {
int x=q.front();
q.pop();
for (int i=; i<G[x].size(); i++) {
edge &e=G[x][i];
if (e.cap>&&level[e.to]<) {
level[e.to]=level[x]+;
q.push(e.to);
}
}
}
} int dfs(int x, int t, int f) {
if (x==t) return f;
for (int &i=iter[x]; i<G[x].size(); i++) {
edge &e=G[x][i];
if (e.cap>&&level[e.to]>level[x]) {
int d=dfs(e.to,t,min(f,e.cap));
if (d>) {
e.cap-=d;
G[e.to][e.rev].cap+=d;
return d;
}
}
}
return ;
} int max_flow(int s, int t) {
int flow=;
for(;;) {
bfs(s);
if (level[t]<) return flow;
memset(iter,,sizeof(iter));
int f;
while ((f=dfs(s,t,INF))>)
flow+=f;
}
}
} namespace ISAP {
int gap[maxn+];
int iter[maxn+];
int level[maxn+]; void bfs(int t) {
memset(gap,,sizeof(gap));
memset(level,-,sizeof(level));
queue <int> q;
level[t]=;
gap[level[t]]=;
q.push(t); while (!q.empty()) {
int x=q.front();
q.pop();
for (int i=; i<G[x].size(); i++) {
edge &e=G[x][i];
if (level[e.to]<) {
level[e.to]=level[x]+;
gap[level[e.to]]++;
q.push(e.to);
}
}
}
} int dfs(int x, int s, int t, int f) {
if (x==t) return f;
int flow=;
for (int &i=iter[x]; i<G[x].size(); i++) {
edge &e=G[x][i];
if (e.cap>&&level[x]==level[e.to]+) {
int d=dfs(e.to,s,t,min(f-flow,e.cap));
e.cap-=d;
G[e.to][e.rev].cap+=d;
flow+=d;
if (f==flow) return f;
}
} gap[level[x]]--;
if (gap[level[x]]==)
level[s]=n+;
iter[x]=;
gap[++level[x]]++;
return flow;
} int max_flow(int s, int t) {
int flow=;
bfs(t);
memset(iter,,sizeof(iter));
while (level[s]<=n)
flow+=dfs(s,s,t,INF);
return flow;
}
} int main() {
int s,t;
scanf("%d%d%d%d",&n,&m,&s,&t);
init();
printf("%d\n",ISAP::max_flow(s,t));
return ;
}
洛谷 P3376 【【模板】网络最大流】的更多相关文章
- 【最大流ISAP】洛谷P3376模板题
题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...
- P3376 [模板] 网络最大流
https://www.luogu.org/blog/ONE-PIECE/wang-lao-liu-jiang-xie-zhi-dinic EK 292ms #include <bits/std ...
- 洛谷P3376【模板】网络最大流 ISAP
这篇博客写得非常好呀. 传送门 于是我是DCOI这一届第一个网络流写ISAP的人了,之后不用再被YKK她们嘲笑我用Dinic了!就是这样! 感觉ISAP是会比Dinic快,只分一次层,然后不能增广了再 ...
- [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码
[洛谷P3376题解]网络流(最大流)的实现算法讲解与代码 更坏的阅读体验 定义 对于给定的一个网络,有向图中每个的边权表示可以通过的最大流量.假设出发点S水流无限大,求水流到终点T后的最大流量. 起 ...
- 洛谷 P1546 最短网络 Agri-Net
题目链接 https://www.luogu.org/problemnew/show/P1546 题目背景 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当 ...
- 洛谷P1546 最短网络 Agri-Net(最小生成树,Kruskal)
洛谷P1546 最短网络 Agri-Net 最小生成树模板题. 直接使用 Kruskal 求解. 复杂度为 \(O(E\log E)\) . #include<stdio.h> #incl ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷 P3376 【模板】网络最大流
题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...
- 洛谷——P3376 【模板】网络最大流
题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...
随机推荐
- 意外的php之学习笔记
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/gc_gongchao/article/details/37312039 什么是php? ph ...
- OC闪屏页尺寸
1242*2688 828*1972 1125x2436 1242×2208 750×1334 640×960 640×1136 320x480 640x960 640x1136
- docker+kibana+filebeat的安装
安装filebeat服务(在需要收集日志的主机安装filebeat) 下载和安装key文件 rpm --import https://packages.elastic.co/GPG-KEY-elast ...
- python使用telnetlib
python使用telnetlib 1 前言 目前,本篇仅记录前段时间搜索得到的关于python使用Telnet的技术博客,由于受领新任务,未进一步验证和深入研究与应用. 参考链接: python官网 ...
- 白话skynet第二篇:skynet的通信调试pack和sprotol
今天来说说Skynet客户端和服务端网络通信的基础部分. Skynet当前版本.lua是skynet自带的5.3版本. 根据示例,我们可以知道.通信的步骤如下. 客户端按大小端打包成二进制. sock ...
- springMVC--XML解析
一 springMVC 入口 web.xml; DispatcherServlet二 初始化过程 1.寻找init(); 查看DispatcherServlet时候时,继承自servlet,肯定有初始 ...
- 检测U盘插入、拨出状态
头文件 #include <Dbt.h> 关键代码: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LP ...
- java消息队列--ActiveMQ
1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...
- Yarn 组件的指挥部 – 调度器Scheduler
linux基础 为hadoop集群的搭建扫清了障碍,也为内存的管理,文件系统的管理扫清了障碍 接着到Hadoop的阶段,首先做集群的安装,深入到使用这两个核心的组件,分布式文件系统HDFS,解决大量数 ...
- Redis详解与常见问题解决方案
Redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sor ...