A - Drainage Ditches

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

 

Description

Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by water for awhile and takes quite a long time to regrow. Thus, Farmer John has built a set of drainage ditches so that Bessie's clover patch is never covered in water. Instead, the water is drained to a nearby stream. Being an ace engineer, Farmer John has also installed regulators at the beginning of each ditch, so he can control at what rate water flows into that ditch. 
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

The input includes several cases. For each case, the first line contains two space-separated integers, N (0 <= N <= 200) and M (2 <= M <= 200). N is the number of ditches that Farmer John has dug. M is the number of intersections points for those ditches. Intersection 1 is the pond. Intersection point M is the stream. Each of the following N lines contains three integers, Si, Ei, and Ci. Si and Ei (1 <= Si, Ei <= M) designate the intersections between which this ditch flows. Water will flow through this ditch from Si to Ei. Ci (0 <= Ci <= 10,000,000) is the maximum rate at which water will flow through the ditch. 
 

Output

For each case, output a single integer, the maximum rate at which water may emptied from the pond. 
 

Sample Input

5 4
1 2 40
1 4 20
2 4 20
2 3 30
3 4 10
 

Sample Output

50
 
 
题意: 给一个有向有环图,给出每条边到容量上限,无下限,源点是1,汇点是n,求最大流。赤裸裸点网络流,我用的ISAP算法。第一次过点网络流^_^
 
思路: ISAP模板过。白书上没给ISAP的BFS。。搞了好久才知道怎么改。。
 
代码
 
#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 (网络流)的更多相关文章

  1. hdu 1532 Drainage Ditches(网络流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532 题目大意是:农夫约翰要把多个小池塘的水通过池塘间连接的水渠排出去,从池塘1到池塘M最多可以排多少 ...

  2. HDU 1532 Drainage Ditches(网络流模板题)

    题目大意:就是由于下大雨的时候约翰的农场就会被雨水给淹没,无奈下约翰不得不修建水沟,而且是网络水沟,并且聪明的约翰还控制了水的流速, 本题就是让你求出最大流速,无疑要运用到求最大流了.题中m为水沟数, ...

  3. HDU 1532 Drainage Ditches (最大网络流)

    Drainage Ditches Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) To ...

  4. 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) ...

  5. HDU 1532 Drainage Ditches(最大流 EK算法)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1532 思路: 网络流最大流的入门题,直接套模板即可~ 注意坑点是:有重边!!读数据的时候要用“+=”替 ...

  6. POJ 1273 || HDU 1532 Drainage Ditches (最大流模型)

    Drainage DitchesHal Burch Time Limit 1000 ms Memory Limit 65536 kb description Every time it rains o ...

  7. poj 1273 && hdu 1532 Drainage Ditches (网络最大流)

    Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 53640   Accepted: 2044 ...

  8. hdu 1532 Drainage Ditches(最大流)

                                                                                            Drainage Dit ...

  9. hdu 1532 Drainage Ditches(最大流模板题)

    Drainage Ditches Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

随机推荐

  1. Maven 编译

    pom.xml 添加插件 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins< ...

  2. <转载> pycharm快捷键及一些常用设置

    1.编辑(Editing ) Ctrl + Space 基本的代码完成(类.方法.属性)Ctrl + Alt + Space 快速导入任意类Ctrl + Shift + Enter 语句完成Ctrl ...

  3. 九度OJ 1144:Freckles(斑点) (最小生成树)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1538 解决:760 题目描述: In an episode of the Dick Van Dyke show, little Richi ...

  4. cmake使用第三方库

    1 link_directories和target_link_libraries 1.1 link_directories 告诉linker去这些目录去找library. 1.2 target_lin ...

  5. 我的Java开发学习之旅------>Java使用ObjectOutputStream和ObjectInputStream序列号对象报java.io.EOFException异常的解决方法

    今天用ObjectOutputStream和ObjectInputStream进行对象序列化话操作的时候,报了java.io.EOFException异常. 异常代码如下: java.io.EOFEx ...

  6. ios之编码规范具体说明

    iOS代码规范: 所有代码规范所有遵循苹果sdk的原则,不清楚的请訪问苹果SDK文档或下载官方Demo查看. 1.project部分: 将项目中每一个功能模块相应的源文件放入同一目录下,使用虚拟目录. ...

  7. linux c编程:gdb的使用

    首先用一个简单的打印字符的程序来做下示例 #include<stdio.h>#include<string.h>void main(){    int i=0;    char ...

  8. 【linux】top更改排序顺序

    top更改排序顺序的方式有很多,这里介绍两个比较简单使用的. 1,快捷键: 大写M:根据内存排序,默认从大到小,大写R更改为从小到大排序 大写P:根据CPU使用排序,默认从大到小,大写R更改为从小到大 ...

  9. 前端JSONPJIE解决跨域问题

    解决同源策略的两个方法 1 . JSONP jsonp (将 JSON 数据填充进回调函数,这就是JSONP的JSON+Padding 的含义) jsonp是json用来跨域的一个东西,原理是通过sc ...

  10. linux日常开发使用命令整理

    linux: 安装ssh-server:$ sudo apt-get install openssh-server 更新软件库:$ sudo apt-get update 启动ssh:$ sudo / ...