网络流一直没学,来学一波网络流。

https://vjudge.net/problem/POJ-1273

题意:给定点数,边数,源点,汇点,每条边容量,求最大流。

解法:EK或dinic。

EK:每次增广用bfs选择一条从源到汇具有最少边数的增广路径,然后找出该路径容量最小的边,就是此次增加的流量,然后沿该路径增加反向边,同时修改每条边的容量,重复上述过程直到找不到增广路(即minFlow = 0)为止。

dinic: 每次bfs从源点到汇点分层(层数是源点到它最少要经过的边数),然后dfs从源点开始不断向下一层找增广路,碰到汇点说明找到一条,进行增广。然后回溯到点u(u是满足(u,v)容量为0的最上层节点)继续寻找增广路,如果回溯到源点且无法继续往下走dfs结束,然后对残余网络再分层,再dfs直到无法分层,算法结束。

 #include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int G[][];
int pre[]; //前驱
bool vis[];
int n,m; //1是源,m是汇 inline int solve(){
deque<int> q;
memset(pre,,sizeof pre);
memset(vis,,sizeof vis);
pre[] = ;
vis[] = ;
q.push_back();
bool find = false;
while(!q.empty()){
int v = q.front();
q.pop_front();
for(int i=;i<=m;i++){
if(G[v][i]>&&vis[i]==){
pre[i] = v;
vis[i] = ;
if(i==m){
find = true;
q.clear();
break;
}
else q.push_back(i);
}
}
}
if(!find) return ;
int minFlow = 0x3f3f3f3f;
int v = m;
while(pre[v]){
minFlow = min(minFlow,G[pre[v]][v]);
v = pre[v];
}
v = m;
while(pre[v]){
G[pre[v]][v] -= minFlow;
G[v][pre[v]] += minFlow;
v = pre[v];
}
return minFlow;
} int main(){
while(cin>>n>>m){
memset(G,,sizeof G);
for(int i=;i<n;i++){
int s,e,c;
cin>>s>>e>>c;
G[s][e] += c;
}
int maxFlow = ;
int aug;
while(aug=solve())
maxFlow += aug;
cout<<maxFlow<<endl;
}
return ;
}
 #include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int inf = 0x3f3f3f3f;
int G[][];
bool vis[];
int Layer[];
int n,m; //1是源点,m是汇点 inline bool countLayer(){
int layer = ;
deque<int> q;
memset(Layer,0xff,sizeof Layer);
Layer[] = ;
q.push_back();
while(!q.empty()){
int v = q.front();
q.pop_front();
for(int j=;j<=m;j++){
if(G[v][j]>&&Layer[j]==-){
Layer[j] = Layer[v]+;
if(j==m) return true;
else q.push_back(j);
}
}
}
return false;
} inline int dinic(){
int maxFlow = ;
deque<int> q;
while(countLayer()){
q.push_back();
memset(vis,,sizeof vis);
vis[] = ;
while(!q.empty()){
int nd = q.back();
if(nd==m){
int minc = inf;
int minc_vs;
for(int i=;i<q.size();i++){
int vs = q[i-];
int ve = q[i];
if(G[vs][ve]>){
if(minc>G[vs][ve]){
minc = G[vs][ve];
minc_vs = vs;
}
}
}
maxFlow += minc;
for(int i=;i<q.size();i++){
int vs = q[i-];
int ve = q[i];
G[vs][ve] -= minc;
G[ve][vs] += minc;
}
while(!q.empty()&&q.back()!=minc_vs){
vis[q.back()] = ;
q.pop_back();
}
}
else {
int i;
for(i=;i<=m;i++){
if(G[nd][i]>&&Layer[i]==Layer[nd]+&&!vis[i]){
vis[i] = ;
q.push_back(i);
break;
}
}
if(i>m) q.pop_back();
}
}
}
return maxFlow;
} int main(){
while(cin>>n>>m){
memset(G,,sizeof G);
for(int i=;i<n;i++){
int s,e,c;
cin>>s>>e>>c;
G[s][e] += c;
}
cout<<dinic()<<endl;
}
return ;
}

poj1273 Drainage Ditches (最大流板子的更多相关文章

  1. poj-1273 Drainage Ditches(最大流基础题)

    题目链接: Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 67475   Accepted ...

  2. POJ-1273 Drainage Ditches 最大流Dinic

    Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 65146 Accepted: 25112 De ...

  3. POJ1273:Drainage Ditches(最大流入门 EK,dinic算法)

    http://poj.org/problem?id=1273 Description Every time it rains on Farmer John's fields, a pond forms ...

  4. [poj1273]Drainage Ditches(最大流)

    解题关键:最大流裸题 #include<cstdio> #include<cstring> #include<algorithm> #include<cstd ...

  5. poj1273 Drainage Ditches Dinic最大流

    Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 76000   Accepted: 2953 ...

  6. Poj 1273 Drainage Ditches(最大流 Edmonds-Karp )

    题目链接:poj1273 Drainage Ditches 呜呜,今天自学网络流,看了EK算法,学的晕晕的,留个简单模板题来作纪念... #include<cstdio> #include ...

  7. 2018.07.06 POJ1273 Drainage Ditches(最大流)

    Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Description Every time it rains on Farmer J ...

  8. poj1273 Drainage Ditches

    Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 68414   Accepted: 2648 ...

  9. poj 1273 Drainage Ditches 最大流入门题

    题目链接:http://poj.org/problem?id=1273 Every time it rains on Farmer John's fields, a pond forms over B ...

随机推荐

  1. jboss反序列化漏洞复现(CVE-2017-7504)

    jboss反序列化漏洞复现(CVE-2017-7504) 一.漏洞描述 Jboss AS 4.x及之前版本中,JbossMQ实现过程的JMS over HTTP Invocation Layer的HT ...

  2. SQL Server 插入数据时自增长列如何指定数值

    SQL Server 表在导入数据时,有时需要将自增长列指定数值,来保证导入前后的数据完全一致,如何实现? SQL Server 提供了方法: SET IDENTITY_INSERT,允许将显式值插入 ...

  3. ES 24 - 如何通过Elasticsearch进行聚合检索 (分组统计)

    目录 1 普通聚合分析 1.1 直接聚合统计 1.2 先检索, 再聚合 1.3 扩展: fielddata和keyword的聚合比较 2 嵌套聚合 2.1 先分组, 再聚合统计 2.2 先分组, 再统 ...

  4. S2:类的构造函数

    类的构造函数构造函数名与类名形同,不返回任何值,主要完成对象的初始化工作. (1)在构造函数中,可以给属性设置默认值(2)this只带当前对象 (3)如果不给属性赋初始值,则会以默认值来填充.(4)如 ...

  5. scripts may close only the windows that were opened by it 浏览器JS控制无法关闭当前页面

    非window.open形式打开的子页面用js的window.close在chrome下就会提示scripts may close only the windows that were opened ...

  6. 1、大型项目的接口自动化实践记录--robotframework环境搭建

    因为人力.团队技术问题,选用robotframework来做自动化,首先说下环境搭建 齐涛道长的入门教程非常棒:http://blog.csdn.net/tulituqi/article/detail ...

  7. 封装 Gson 解析Json到对象是否失败

    在使用Google的 Gson 类库解析 Json 数据时,难免会出现解析失败的情况. 在这种情况下,使用 if(obj == null) 是不可行的,fromJson 方法会自动生成对象的实例,所以 ...

  8. java基本数据类型和包装类之间的区别

    1.声明方式不同,基本类型不适用new关键字,而包装类型需要使用new关键字来在堆中分配存储空间: 2.存储方式及位置不同,基本类型是直接将变量值存储在堆栈中,而包装类型是将对象放在堆中,然后通过引用 ...

  9. 直方图均衡基本原理及Python实现

    1. 基本原理 通过一个变换,将输入图像的灰度级转换为`均匀分布`,变换后的灰度级的概率密度函数为 $$P_s(s) = \frac{1}{L-1}$$ 直方图均衡的变换为 $$s = T(r) = ...

  10. CentOS 7服务器安装brook和bbr加速

    一.安装Brook 执行一键部署脚本 $ wget -N --no-check-certificate wget -N --no-check-certificate https://raw.githu ...