洛谷 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行每行 ...
随机推荐
- afn3.0源码解析---AFURLRequestSerialization
AFHTTPRequestSerialization: @方法1 - (NSMutableURLRequest *)requestWithMethod:(NSString *)method URLSt ...
- DS1-14
#include <stdio.h> #define MAXSIZE 10000 int MaxSubseqSum4(int List[], int N); int main() { in ...
- Percona-Toolkit 之 pt-table-checksum 总结
pt-table-checksum - Verify MySQL replication integrity. pt-table-checksum performs an online replica ...
- SQL Server脚本
-- 清楚缓冲区 DBCC DROPCLEANBUFFERS -- 删除计划高速缓存中的元素 DBCC FREEPROCCACHE -- 执行时间 SET STATISTICS TIME ON -- ...
- Go 初体验 - 并发与锁.2 - sync.WaitGroup
sync包里的WaitGroup主要用于协程同步 计数主协程创建的子线程 WaitGoup.Add(i) 调用清除标记方法WaitGroup.Done() 使用WaitGroup.Wait()来阻塞, ...
- 蓝桥杯c/c++省赛真题——明码
标题:明码 汉字的字形存在于字库中,即便在今天,16点阵的字库也仍然使用广泛.###16点阵的字库把每个汉字看成是16x16个像素信息.并把这些信息记录在字节中. ###一个字节可以存储8位信息,用3 ...
- C# 实现http不同方法的请求
p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...
- ForkJoinPool
fork():开启一个新线程(或是重用线程池内的空闲线程),将任务交给该线程处理. join():等待该任务的处理线程处理完毕,获得返回值. ForkJoinPool 的每个工作线程都维护着一个工作队 ...
- mika的模板库
二分图最大匹配: 1.匈牙利算法:注意dfs中是dfs(c[w[i]]),搜索的是与之匹配的点. #include<cstdio> #include<cstring> ],w[ ...
- shell里连接数据库,将结果输出到变量
result=$(sqlplus -s 'ccc/ccc@21.96.34.34:1521'<<EOF ..... EOF )