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

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. Android Studio 'AIDL is missing' 且 不识别R文件

    最近刚开始用Android Studio,出的问题还真不少.昨天不知为何不能新建项目了,这两天重装了几次才搞定. 可又出了这个问题: 原因:Compile Sdk Version和Build Tool ...

  2. Android Studio 蓝牙开发实例——基于Android 6.0

    因项目需要做一个Android 的蓝牙app来通过手机蓝牙传输数据以及控制飞行器,在此,我对这段时间里写的蓝牙app的代码进行知识梳理和出现错误的总结. 该应用的Compile Sdk Version ...

  3. C#中属性的解析

    一.域的概念 C#中域是指成员变量和方法,在OOP编程中(面向对象编程)我们要求用户只知道类是干什么的,而不许知道如何完成的,或者说不允许访问类的内部,对于有必要在类外可见的域,我们用属性来表达,所以 ...

  4. 经典SQL(sqlServer)

    一.基础 .说明:创建新表create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) .分组: ...

  5. Extjs的文件上传问题

    最近做一个ExtJs4.0的文件上传.发现在没有添加 xtype:filefield,   时提交数据form的数据,修改form都能提交,而且返回正常.但是当加入xtype:filefield后,返 ...

  6. 代码生成java连接数据库的所需代码(超详细)

    开始学习: round 1:(一开始学习当然还是要一步一步学习的啦,哪有什么一步登天!!!) a.准备工作:1.eclipse,mysql(这两个软件肯定要的啦,不然学什么把它们连接起来) 2.加载驱 ...

  7. java高并发系列 - 第22天:java中底层工具类Unsafe,高手必须要了解

    这是java高并发系列第22篇文章,文章基于jdk1.8环境. 本文主要内容 基本介绍. 通过反射获取Unsafe实例 Unsafe中的CAS操作 Unsafe中原子操作相关方法介绍 Unsafe中线 ...

  8. 1.2模板templates

    一.模板使用 1. 配置模板目录 如果命令行创建的项目,需要手动配置模板文件目录,如果是Pycharm创建的项目,则无需配置 在项目根目录下创建模板目录,比如叫 templates,后续开发模板文件会 ...

  9. ASP.NET Core on K8S深入学习(4)你必须知道的Service

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 前面几篇文章我们都是使用的ClusterIP供集群内部访问,每个Pod都有一个 ...

  10. java读取本机磁盘及遍历磁盘文件

    1. 获取本机所有盘符信息 //1. 获取本机盘符 File[] roots = File.listRoots(); for (int i = 0; i < roots.length; i++) ...