【模板】最大流模板(dinic)
题目描述
如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。
输入输出格式
输入格式:
第一行包含四个正整数N、M、S、T,分别表示点的个数、有向边的个数、源点序号、汇点序号。
接下来M行每行包含三个正整数ui、vi、wi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi)
输出格式:
一行,包含一个正整数,即为该网络的最大流。
输入输出样例
输入样例#1:
4 5 4 3
4 2 30
4 3 20
2 3 20
2 1 30
1 3 40
输出样例#1:
50
说明
时空限制:1000ms,128M
数据规模:
对于30%的数据:N<=10,M<=25
对于70%的数据:N<=200,M<=1000
对于100%的数据:N<=10000,M<=100000
一堆注释掉的中间输出见证了脑残错误的代价QAQ。。。
code:
//By Menteur_Hxy
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
int rd() {
int x=0,fla=1;
char c=' ';
while(c>'9'|| c<'0') {if(c=='-') fla=-fla; c=getchar();}
while(c<='9'&&c>='0') x=x*10+c-'0',c=getchar();
// scanf("%d",&x);
return x*fla;
}
const int MAX=10010;
const int INF=1e9;
int n,m,s,t,cnt;
int maxflow;
int head[MAX],deep[MAX],cur[MAX];
struct edges{
int to,next,w;
};
edges edge[200010];
void add(int x,int y,int z) {
edge[++cnt].next=head[x];
edge[cnt].to=y;
edge[cnt].w=z;
head[x]=cnt;
// cout<<cnt<<" "<<edge[cnt].to<<" "<<edge[cnt].next<<" "<<edge[cnt].w<<endl;
}
queue <int> q;
bool bfs() {
memset(deep,0,sizeof deep);
deep[s]=1;
for(int i=1;i<=n;i++) cur[i]=head[i];//!!!
while(!q.empty()) q.pop();
q.push(s);
while(!q.empty()) {
int u=q.front(),v; q.pop();
for(int i=head[u];i!=-1;i=edge[i].next)
if(!deep[v=edge[i].to] && edge[i].w) {
deep[v]=deep[u]+1;
q.push(v);
}
}
// cout<<deep[t]<<endl;
// for(int i=1;i<=n;i++) cout<<deep[i]<<" ";
// cout<<endl;
return deep[t];
}
int dfs(int now,int flow) {
if(now==t) return flow;
for(int& i=cur[now];i!=-1;i=edge[i].next) {
int v=edge[i].to,di;
// if(v==t) cout<<edge[i].w<<endl;
if(deep[now]+1==deep[v] && edge[i].w
&& (di=dfs(v,min(flow,edge[i].w))) ) {
// if(v==t) cout<<edge[i].w<<endl;
edge[i].w-=di;
edge[i^1].w+=di;
return di;
}
}
return 0;
}
void dinic() {
while(bfs())
while(int di=dfs(s,INF))
maxflow+=di;
}
int main() {
n=rd(),m=rd(),s=rd(),t=rd();
cnt=-1;
memset(head,-1,sizeof head);
for(int i=1;i<=m;i++) {
int a=rd(),b=rd(),c=rd();
add(a,b,c);
add(b,a,0);
}
dinic();
printf("%lld",maxflow);
return 0;
}
【模板】最大流模板(dinic)的更多相关文章
- 图论算法-最小费用最大流模板【EK;Dinic】
图论算法-最小费用最大流模板[EK;Dinic] EK模板 const int inf=1000000000; int n,m,s,t; struct node{int v,w,c;}; vector ...
- 【Luogu】P3376网络最大流模板(Dinic)
最大流模板成为另一个被攻克的模板题. 今天QDC给我讲了一下Dinic,感觉很好懂.于是为了巩固就把这道题A掉了. 核心思想就是不断BFS分层,然后不断DFS找增广路.找不到之后就可以把答案累加输出了 ...
- ZOJ_2314_Reactor Cooling_有上下界可行流模板
ZOJ_2314_Reactor Cooling_有上下界可行流模板 The terrorist group leaded by a well known international terroris ...
- Drainage Ditches---hdu1532(最大流, 模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532 最大流模板题: EK:(复杂度为n*m*m); #include<stdio.h> ...
- Flow Problem(最大流模板)
Flow Problem Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tota ...
- 最大流 && 最小费用最大流模板
模板从 这里 搬运,链接博客还有很多网络流题集题解参考. 最大流模板 ( 可处理重边 ) ; const int INF = 0x3f3f3f3f; struct Edge { int from ...
- HDU3376 最小费用最大流 模板2
Matrix Again Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)To ...
- HDU2686 费用流 模板
Matrix Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- hdu4292 Food 最大流模板题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4292 题意:水和饮料,建图跑最大流模板. 我用的是学长的模板,最然我还没有仔细理解,不过这都不重要直接 ...
- HDU-3549Flow Problem 最大流模板题
传送门 这里是Ford-Fulkerson写的最大流模板 #include <iostream> #include <cstdio> #include <algorith ...
随机推荐
- hdu 1239
首先,p,q>=2,所以p,q<=50000; 然后,我们观察a<=b<1000,而p,q<=100000.那么,q>=10000时,p<=10,则a/b&l ...
- 【cl】oracle之Sequence
sequence:序列 首先要有create sequence或者create any sequence权限: 1.语法如下: create sequence cltest---序列名 increm ...
- 初探swift语言的学习笔记三(闭包-匿名函数)
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29353019 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...
- leetcode || 56、 Merge Intervals
problem: Given a collection of intervals, merge all overlapping intervals. For example, Given [1,3], ...
- 一步一步跟我学习lucene(18)---lucene索引时join和查询时join使用演示样例
了解sql的朋友都知道,我们在查询的时候能够採用join查询,即对有一定关联关系的对象进行联合查询来对多维的数据进行整理.这个联合查询的方式挺方便的.跟我们现实生活中的托人找关系类似,我们想要完毕一件 ...
- hdoj--5620--KK's Steel(斐波那契数)
KK's Steel Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- 2018亚洲区预选赛北京赛站网络赛 D.80 Days 尺取
题面 题意:你带着K元要去n个城市,这n个城市是环形的,你可以选择任意一个起点,然后顺时针走,对于每个城市,到达时可以获得a元,但是从这里离开又需要花费b元,问你能否找到一个起点(输出花钱最少的那个) ...
- Webpack 中的 Tree Shaking
Tree Shaking Tree shaking 用于描述移除JavaScript上下文中的未引用代码(dead-code). 为了更方便地理解tree shaking,我们可以将应用程序想象成一棵 ...
- RDS中的.frm和.ibd文件转换为sql文件
--- 转自他人 mysql存储在磁盘中,各种天灾人祸都会导致数据丢失.大公司的时候我们常常需要做好数据冷热备,对于小公司来说要做好所有数据备份需要支出大量的成本,很多公司也是不现实的.万一还没有做好 ...
- Educational Codeforces Round 35
Nearest Minimums 相同的数里最小的数里的最小距离 Solution Two Cakes Solution Three Garlands 瞎比试 Solution Inversion C ...