HDU 1532 Drainage Ditches (网络流)
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Description
Farmer John knows not only how many gallons of water each ditch can transport per minute but also the exact layout of the ditches, which feed out of the pond and into each other and stream in a potentially complex network.
Given all this information, determine the maximum rate at which water can be transported out of the pond and into the stream. For any given ditch, water flows in only one direction, but there might be a way that water can flow in a circle.
Input
Output
Sample Input
1 2 40
1 4 20
2 4 20
2 3 30
3 4 10
Sample Output
#include <vector>
#include <cstdio>
#include <cstring>
#include <queue>
#define FOR(i,n) for(i=1;i<=(n);i++)
using namespace std;
const int INF = 2e9+;
const int N = ; struct Edge{
int from,to,cap,flow;
}; struct ISAP{
int n,m,s,t;
int p[N],num[N];
vector<Edge> edges;
vector<int> G[N];
bool vis[N];
int d[N],cur[N];
void init(int _n,int _m)
{
n=_n; m=_m;
int i;
edges.clear();
FOR(i,n)
{
G[i].clear();
d[i]=INF;
}
}
void AddEdge(int from,int to,int cap)
{
edges.push_back((Edge){from,to,cap,});
edges.push_back((Edge){to,from,,});
m = edges.size();
G[from].push_back(m-);
G[to].push_back(m-);
}
bool BFS()
{
memset(vis,,sizeof(vis));
queue<int> Q;
Q.push(t);
d[t]=;
vis[t]=;
while(!Q.empty())
{
int x = Q.front(); Q.pop();
for(unsigned i=;i<G[x].size();i++)
{
Edge& e = edges[G[x][i]^];
if(!vis[e.from] && e.cap>e.flow)
{
vis[e.from]=;
d[e.from] = d[x]+;
Q.push(e.from);
}
}
}
return vis[s];
}
int Augment()
{
int x=t, a=INF;
while(x!=s)
{
Edge& e = edges[p[x]];
a = min(a,e.cap-e.flow);
x = edges[p[x]].from;
}
x = t;
while(x!=s)
{
edges[p[x]].flow+=a;
edges[p[x]^].flow-=a;
x=edges[p[x]].from;
}
return a;
}
int Maxflow(int _s,int _t)
{
s=_s; t=_t;
int flow = , i;
BFS();
// FOR(i,n) printf("%d ",d[i]); puts("");
if(d[s]>=n) return ;
memset(num,,sizeof(num));
memset(p,,sizeof(p));
FOR(i,n) if(d[i]<INF) num[d[i]]++;
int x=s;
memset(cur,,sizeof(cur));
while(d[s]<n)
{
if(x==t)
{
flow+=Augment();
x=s;
}
int ok=;
for(unsigned i=cur[x];i<G[x].size();i++)
{
Edge& e=edges[G[x][i]];
if(e.cap>e.flow && d[x]==d[e.to]+)
{
ok=;
p[e.to]=G[x][i];
cur[x]=i;
x=e.to;
break;
}
}
if(!ok)
{
int m=n-;
for(unsigned i=;i<G[x].size();i++)
{
Edge& e=edges[G[x][i]];
if(e.cap>e.flow) m=min(m,d[e.to]);
}
if(--num[d[x]]==) break;
num[d[x]=m+]++;
cur[x]=;
if(x!=s) x=edges[p[x]].from;
}
}
return flow;
}
}; ISAP isap; int main()
{
freopen("in","r",stdin);
int n,m,u,v,c;
while(scanf("%d%d",&m,&n)!=EOF)
{
isap.init(n,m);
while(m--)
{
scanf("%d%d%d",&u,&v,&c);
isap.AddEdge(u,v,c);
//isap.AddEdge(v,u,c);
}
printf("%d\n",isap.Maxflow(,n));
}
return ;
}
ISAP 模板
注意用宏定义的FOR来做点的初始化,有些题目点所从0开始编号有些所从1开始,所以需要用一个宏定义
struct Edge{
int from,to,cap,flow;
};
struct ISAP{
int n,m,s,t;
int p[N],num[N];
vector<Edge> edges;
vector<int> G[N];
bool vis[N];
int d[N],cur[N];
void init(int _n,int _m)
{
n=_n; m=_m;
int i;
edges.clear();
FOR(i,n)
{
G[i].clear();
d[i]=INF;
}
}
void AddEdge(int from,int to,int cap)
{
edges.push_back((Edge){from,to,cap,});
edges.push_back((Edge){to,from,,});
m = edges.size();
G[from].push_back(m-);
G[to].push_back(m-);
}
bool BFS()
{
memset(vis,,sizeof(vis));
queue<int> Q;
Q.push(t);
d[t]=;
vis[t]=;
while(!Q.empty())
{
int x = Q.front(); Q.pop();
for(unsigned i=;i<G[x].size();i++)
{
Edge& e = edges[G[x][i]^];
if(!vis[e.from] && e.cap>e.flow)
{
vis[e.from]=;
d[e.from] = d[x]+;
Q.push(e.from);
}
}
}
return vis[s];
}
int Augment()
{
int x=t, a=INF;
while(x!=s)
{
Edge& e = edges[p[x]];
a = min(a,e.cap-e.flow);
x = edges[p[x]].from;
}
x = t;
while(x!=s)
{
edges[p[x]].flow+=a;
edges[p[x]^].flow-=a;
x=edges[p[x]].from;
}
return a;
}
int Maxflow(int _s,int _t)
{
s=_s; t=_t;
int flow = , i;
BFS();
if(d[s]>=n) return ;
memset(num,,sizeof(num));
memset(p,,sizeof(p));
FOR(i,n) num[d[i]]++;
int x=s;
memset(cur,,sizeof(cur));
while(d[s]<n)
{
if(x==t)
{
flow+=Augment();
x=s;
}
int ok=;
for(unsigned i=cur[x];i<G[x].size();i++)
{
Edge& e=edges[G[x][i]];
if(e.cap>e.flow && d[x]==d[e.to]+)
{
ok=;
p[e.to]=G[x][i];
cur[x]=i;
x=e.to;
break;
}
}
if(!ok)
{
int m=n-;
for(unsigned i=;i<G[x].size();i++)
{
Edge& e=edges[G[x][i]];
if(e.cap>e.flow) m=min(m,d[e.to]);
}
if(--num[d[x]]==) break;
num[d[x]=m+]++;
cur[x]=;
if(x!=s) x=edges[p[x]].from;
}
}
return flow;
}
};
HDU 1532 Drainage Ditches (网络流)的更多相关文章
- hdu 1532 Drainage Ditches(网络流)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532 题目大意是:农夫约翰要把多个小池塘的水通过池塘间连接的水渠排出去,从池塘1到池塘M最多可以排多少 ...
- HDU 1532 Drainage Ditches(网络流模板题)
题目大意:就是由于下大雨的时候约翰的农场就会被雨水给淹没,无奈下约翰不得不修建水沟,而且是网络水沟,并且聪明的约翰还控制了水的流速, 本题就是让你求出最大流速,无疑要运用到求最大流了.题中m为水沟数, ...
- HDU 1532 Drainage Ditches (最大网络流)
Drainage Ditches Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) To ...
- HDU 1532 Drainage Ditches 分类: Brush Mode 2014-07-31 10:38 82人阅读 评论(0) 收藏
Drainage Ditches Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDU 1532 Drainage Ditches(最大流 EK算法)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1532 思路: 网络流最大流的入门题,直接套模板即可~ 注意坑点是:有重边!!读数据的时候要用“+=”替 ...
- POJ 1273 || HDU 1532 Drainage Ditches (最大流模型)
Drainage DitchesHal Burch Time Limit 1000 ms Memory Limit 65536 kb description Every time it rains o ...
- poj 1273 && hdu 1532 Drainage Ditches (网络最大流)
Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 53640 Accepted: 2044 ...
- hdu 1532 Drainage Ditches(最大流)
Drainage Dit ...
- hdu 1532 Drainage Ditches(最大流模板题)
Drainage Ditches Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
随机推荐
- java jdbc 同时操作查询删除操作
Connection conn = null; try { // 创建连接实例 conn = JdbcUtility.GetFactory() ...
- struts2 Eclipse 中集成strust2开发框架实例
下面通过建立一个小的实例具体来说明Eclipse 集成struts2,以下实例采用的为 struts2 版本为 struts2 2.2.3.1 为应用. 1. 下载struts2的开发包 第一步: 在 ...
- python 基础 5.1 python 构造器
一. 类的构造器 __init__ 构造函数,在生成对象时调用.由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去.通过定义一个特殊的__init__方法, ...
- C# 串口发送 陷阱,必须知道的坑
目的:间隔100毫秒持续发送指令 由于 C#串口发送为同步方式发送,发送占用时间较长,导致发送变慢, 自己写工具并手工测试两种波特率发送占用时长如下
- Node.js面试题
Node.js面试题列表 什么是错误优先的回调函数? 如何避免回调地狱? 如何用Node来监听80端口? 什么是事件循环? 哪些工具可以用来保证一致的编程风格? 什么是测试金字塔?对于HTTP API ...
- android菜鸟学习笔记10----Intent及<intent-filter>
关于Bundle: 注意到Activity的onCreate()方法的签名是protected void onCreate(Bundle savedInstanceState),其参数是一个Bundl ...
- java中随机生成汉字
main方法中使用: //随机生成100个汉字 String ss=""; for(int i=0;i<100;i++){ ss+=getChinese(i); } Syst ...
- empty blank
非nil对象才能调用 empty nil: 对象是否存在empty: ”“ []blank: nil emptypresent: ! blank
- Django 模型层--单表
ORM 简介 MTV或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这可以大大的减少了开 ...
- ajax 异步 跨域上传图片
客户端 <label for="text">名称</label> <input type="text" id="text ...