Drainage Ditches
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 64044   Accepted: 24718

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:
 #include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#define mem(x,y) memset(x,y,sizeof(x))
#include<queue>
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
const int MAXN=;
int map[MAXN][MAXN];
queue<int>dl;
int vis[MAXN],pre[MAXN];
int N;
bool bfs(int s,int e){
mem(vis,);
mem(pre,);
while(!dl.empty())dl.pop();
vis[s]=;dl.push(s);
int a;
while(!dl.empty()){
a=dl.front();dl.pop();
if(a==e)return true;
for(int i=;i<=N;i++){
if(!vis[i]&&map[a][i]){
vis[i]=;
dl.push(i);
pre[i]=a;
}
}
}
return false;
}
LL maxflow(int s,int e){
LL flow=;
while(bfs(s,e)){
int r=e;
int temp=INF;
while(r!=s){
temp=min(temp,map[pre[r]][r]);
r=pre[r];
}
r=e;
while(r!=s){
map[pre[r]][r]-=temp;
map[r][pre[r]]+=temp;
r=pre[r];//这句话不能少。。
}
flow+=temp;
}
return flow;
}
int main(){
int M;
while(~scanf("%d%d",&M,&N)){
mem(map,);
int u,v,w;
while(M--){
scanf("%d%d%d",&u,&v,&w);
map[u][v]+=w;
}
printf("%I64d\n",maxflow(,N));
}
return ;
}

代码2:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#define mem(x,y) memset(x,y,sizeof(x))
using namespace std;
const int INF=0x3f3f3f3f;
typedef long long LL;
const int MAXN=210;
const int MAXM=2020;
int head[MAXM];
int vis[MAXN],dis[MAXN];
int edgnum;
struct Node{
int from,to,next,cup,flow;
};
Node edg[MAXM];
queue<int>dl;
void initial(){
mem(head,-1);edgnum=0;
}
void add(int u,int v,int w){
Node E={u,v,head[u],w,0};
edg[edgnum]=E;
head[u]=edgnum++;
E={v,u,head[v],0,0};
edg[edgnum]=E;
head[v]=edgnum++;
}
bool bfs(int s,int e){
mem(vis,0);mem(dis,-1);
while(!dl.empty())dl.pop();
vis[s]=1;dis[s]=0;dl.push(s);
while(!dl.empty()){
int u=dl.front();dl.pop();
for(int i=head[u];i!=-1;i=edg[i].next){
Node v=edg[i];
if(!vis[v.to]&&v.cup>v.flow){//应该是>
vis[v.to]=1;
dis[v.to]=dis[u]+1;
if(v.to==e)return true;
dl.push(v.to);
}
}
}
return false;
}
int dfs(int x,int la,int e){
if(x==e||la==0)return la;
int temp;
LL flow=0;
for(int i=head[x];i!=-1;i=edg[i].next){
Node &v=edg[i];
if(dis[v.to]==dis[x]+1&&(temp=dfs(v.to,min(la,v.cup-v.flow),e))>0){//这里也应该要>
v.flow+=temp;
edg[i^1].flow-=temp;
la-=temp;
flow+=temp;
if(la==0)break;//这个要判断
}
}
return flow;
}
LL maxflow(int s,int e){
LL flow=0;
while(bfs(s,e)){
flow+=dfs(s,INF,e);
}
return flow;
}
int main(){
int N,M;
while(~scanf("%d%d",&N,&M)){
initial();
int u,v,w;
while(N--){
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
printf("%I64d\n",maxflow(1,M));
}
return 0;
}

Drainage Ditches(最大流)的更多相关文章

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

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

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

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

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

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

  4. TZOJ 4085 Drainage Ditches(最大流)

    描述 Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. Th ...

  5. POJ 1273 - Drainage Ditches - [最大流模板题] - [EK算法模板][Dinic算法模板 - 邻接表型]

    题目链接:http://poj.org/problem?id=1273 Time Limit: 1000MS Memory Limit: 10000K Description Every time i ...

  6. HDU1532 Drainage Ditches —— 最大流(sap算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532 Drainage Ditches Time Limit: 2000/1000 MS (Java/ ...

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

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

  8. hdu 1532 Drainage Ditches(最大流)

                                                                                            Drainage Dit ...

  9. POJ-1273 Drainage Ditches 最大流Dinic

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

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

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

随机推荐

  1. MS Chart 学习心得

    利用Chart控件对学生信息进行统计,最终结果如下: Chart图形控件主要由以下几个部份组成: 1.Annotations --图形注解集合2.ChartAreas  --图表区域集合3.Legen ...

  2. 在CG/HLSL中访问着色器属性(Properties)

    在CG/HLSL中访问着色器属性 Shader在Properties块中访问材质属性.如果你想在一个着色程序中访问一些属性,你需要声明一个Cg/HLSL具有相同的名称和一个匹配的类型的变量. Prop ...

  3. QT中QWidget、QDialog及QMainWindow的区别

    本文转自http://www.cnblogs.com/aqxin/archive/2011/05/23/2054156.html QWidget类是所有用户界面对象的基类. 窗口部件是用户界面的一个基 ...

  4. Vijos 1083 小白逛公园(线段树)

    线段树,每个结点维护区间内的最大值M,和sum,最大前缀和lm,最大后缀和rm. 若要求区间为[a,b],则答案max(此区间M,左儿子M,右儿子M,左儿子rm+右儿子lm). ----------- ...

  5. java的IO流包装不当导致从网页获取的数据出现乱码

    从网页上获取数据时必须要注意字符集的问题.处理不慎确实苦不堪言. 例如通过URL连接时,将字节流InputStream包装成字符流(以便直接存为String)时,一定要注意加上charsetName这 ...

  6. android怎样自定义设置下拉列表样式

    图样: 实现方式: 1.水平布局一个TextView和一个ImageView(小黑箭头) 2.实现点击ImageView的单击事件,弹出PopupWindow 3.PopupWindow中实现下拉列表 ...

  7. Spring-data-redis: 分布式队列

    Redis中list数据结构,具有"双端队列"的特性,同时redis具有持久数据的能力,因此redis实现分布式队列是非常安全可靠的.它类似于JMS中的"Queue&qu ...

  8. android 支持分组和联系人展示的一个小样例

    先看效果图: 要实现这个效果,activity必须实现ExpandableListActivity @Override public void onCreate(Bundle savedInstanc ...

  9. python命令行参数处理

    使用argparse包来解析命令行参数: #/usr/bin/python #encoding=utf-8 import argparse parser = argparse.ArgumentPars ...

  10. ASP.NET页面传值的几种方式

    页面传值是学习asp.net初期都会面临的一个问题,总的来说有页面传值. 存储对象传值.ajax.类.model.表单等!下面欧柏泰克和大家一起来看看asp.net页面传值方式一般有哪些?常用的较简单 ...