Drainage Ditches

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

Total Submission(s): 8599    Accepted Submission(s): 4005

Problem 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
 
Source
 解题报告
EK模板,不多说。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define inf 99999999
#define N 220
#define M 220
using namespace std;
int n,m,edge[N][N],flow,a[N],p[N];
queue<int>Q;
void ek()
{
while(1)
{
while(!Q.empty())
Q.pop();
memset(a,0,sizeof(a));
memset(p,0,sizeof(p));
Q.push(1);
a[1]=inf;
p[1]=1;
while(!Q.empty())
{
int u=Q.front();
Q.pop();
for(int v=1;v<=n;v++)
{
if(!a[v]&&edge[u][v]>0)
{
a[v]=min(a[u],edge[u][v]);
p[v]=u;
Q.push(v);
}
}
if(a[n])break;
}
if(!a[n])break;
for(int u=n;u!=1;u=p[u])
{
edge[p[u]][u]-=a[n];
edge[u][p[u]]+=a[n];
}
flow+=a[n];
}
}
int main()
{
int i,j,u,v,w;
while(~scanf("%d%d",&m,&n))
{
flow=0;
memset(edge,0,sizeof(edge));
for(i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
edge[u][v]+=w;
}
ek();
printf("%d\n",flow);
}
}

又学了Dinic算法。

。。

(基于邻接矩阵的)。前向星不知道怎么处理反向弧。。。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define inf 99999999
#define N 200
#define M 200
using namespace std;
int edge[N][N],flow,l[N],n,m;
int bfs()
{
memset(l,-1,sizeof(l));
queue<int>Q;
l[1]=0;
Q.push(1);
while(!Q.empty())
{
int u=Q.front();
Q.pop();
for(int v=1;v<=n;v++)
{
if(edge[u][v]&&l[v]==-1)
{
l[v]=l[u]+1;
Q.push(v);
}
}
}
if(l[n]>0)
return 1;
else return 0;
}
int dfs(int x,int f)
{
if(x==n)return f;
int a;
for(int i=1;i<=n;i++)
{
if(edge[x][i]&&(l[i]==l[x]+1)&&(a=dfs(i,min(f,edge[x][i]))))
{
edge[x][i]-=a;
edge[i][x]+=a;
return a;
}
}
return 0;
}
int main()
{
int i,j,u,v,w;
while(~scanf("%d%d",&m,&n))
{
memset(edge,0,sizeof(edge));
for(i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
edge[u][v]+=w;
}
int a=0;
flow=0;
while(bfs())
while(a=dfs(1,inf))
flow+=a;
printf("%d\n",flow);
}
return 0;
}

最终觉醒了,之前看了一串非递归的前向星dinic,,。老认为不正确。,,换了一种思路,写成递归调用dfs和邻接表一样,对于处理反向弧加流的话在建边的时候处理,建边一次建两条,正向和反向,这样就知道。反向弧在哪里了,,。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define N 300
#define M 30000
#define inf 99999999
using namespace std;
struct node
{
int u,v,w,r,next;
}edge[M]; int n,m,head[N],l[N],cnt;
void add(int u,int v,int w)
{
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
edge[cnt].r=cnt+1;
head[u]=cnt++;
edge[cnt].u=v;
edge[cnt].v=u;
edge[cnt].w=0;
edge[cnt].next=head[v];
edge[cnt].r=cnt-1;
head[v]=cnt++;
}
int bfs()
{
queue<int >Q;
while(!Q.empty())
Q.pop();
Q.push(1);
memset(l,-1,sizeof(l));
l[1]=0;
while(!Q.empty())
{
int u=Q.front();
Q.pop();
for(int i=head[u];i!=-1;i=edge[i].next)
{
if(edge[i].w&&l[edge[i].v]==-1)
{
l[edge[i].v]=l[u]+1;
Q.push(edge[i].v);
}
}
}
if(l[n]>0)return 1;
else return 0;
}
int dfs(int x,int f)
{
int i,a;
if(x==n)return f;
for(i=head[x];i!=-1;i=edge[i].next)
{
if(edge[i].w&&l[edge[i].v]==l[x]+1&&(a=dfs(edge[i].v,min(f,edge[i].w))))
{
edge[i].w-=a;
edge[edge[i].r].w+=a;
return a;
}
}
return 0;
}
int main()
{
int i,j,u,v,w;
while(cin>>m>>n)
{
memset(head,-1,sizeof(head));
memset(edge,0,sizeof(edge));
cnt=0;
for(i=0;i<m;i++)
{
cin>>u>>v>>w;
add(u,v,w);
}
int ans=0,a;
while(bfs())
while(a=dfs(1,inf))
ans+=a;
cout<<ans<<endl;
}
}


HDU1532_Drainage Ditches(网络流/EK模板/Dinic模板(邻接矩阵/前向星))的更多相关文章

  1. poj-1459-最大流dinic+链式前向星-isap+bfs+stack

    title: poj-1459-最大流dinic+链式前向星-isap+bfs+stack date: 2018-11-22 20:57:54 tags: acm 刷题 categories: ACM ...

  2. 【模板】链式前向星+spfa

    洛谷传送门--分糖果 博客--链式前向星 团队中一道题,数据很大,只能用链式前向星存储,spfa求单源最短路. 可做模板. #include <cstdio> #include <q ...

  3. 模板 Dijkstra+链式前向星+堆优化(非原创)

    我们首先来看一下什么是前向星.   前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序, 并记录下以某个点为起点的所有边在数组中的起始位置和 ...

  4. zzuli 2131 Can Win dinic+链式前向星(难点:抽象出网络模型+建边)

    2131: Can Win Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 431  Solved: 50 SubmitStatusWeb Board ...

  5. 存图方式---邻接表&邻接矩阵&前向星

    基于vector存图 struct Edge { int u, v, w; Edge(){} Edge(int u, int v, int w):u(u), v(v), w(w){} }; vecto ...

  6. 网络流--最大流dinic模板

    标准的大白书式模板,除了变量名并不一样……在主函数中只需要用到 init 函数.add 函数以及 mf 函数 #include<stdio.h> //差不多要加这么些头文件 #includ ...

  7. 网络流--最大流--Dinic模板矩阵版(当前弧优化+非当前弧优化)

    //非当前弧优化版 #include <iostream> #include <cstdio> #include <math.h> #include <cst ...

  8. 网络流-最大流 Dinic模板

    #include <bits/stdc++.h> using namespace std; #define MP make_pair #define PB push_back #defin ...

  9. Drainage Ditches(网络流(EK算法))

    计算最大流,EK算法模板题. #include <stdio.h> #include <string.h> #include <queue> using names ...

随机推荐

  1. selenium - 常用等待操作

    # 4. 等待操作 # 强制等待from time import sleepsleep(10) # 隐性等待# 设置最长等待时间,在这个时间在只要有个时间点加载完成,则执行下一步代码,比sleep智能 ...

  2. python学习--Python之import与from...import的区别与用法

    Python编码第一步是导入模块,有时候用import ***有时候用from...import,它们有什么区别呢,请看实例A/B: A: 1.当模块test.py中没有类,只有方法add,此方法实现 ...

  3. API生命周期第二阶段——设计:采用swagger进行API描述、设计

    本篇博客主要是以swagger为依托,介绍API生命周期的第二个阶段--设计!在详细介绍之前,我必须声明一点:如果是想了解swagger和项目框架的集成的,这里没有.我要介绍的swagger进行的AP ...

  4. .net SignalR 聊天室

    代码地址:https://gitee.com/srnsrn/netSignalr.git 运行项目打开多个页面 私密聊天

  5. Android获取当前应用版本号

    代码改变世界 获取当前应用的版本号 private String getVersionName() throws Exception { // 获取packagemanager的实例 PackageM ...

  6. 【Luogu】P2604网络扩容(费用流乱搞)

    题目链接 这题比较水,就是乱改改费用流模板.判断一下已经满流的边和没有满流的边,然后再改改最大流模板,然后把它们拼起来就是了. 话说这题第一遍90,然后撕烤一会发现自己yy的spfa扩容方式不允许反悔 ...

  7. jsp文件放在WebRoot下还是WebInfo下

    观点一:(较为赞同) 安全性不是真正的原因,因为jsp是要解析后才显示到浏览器的,即使用户知道你jsp的路径,也不可能通过浏览器看到jsp源码的,而如果是通过其它手段入侵服务器的话,放在WEB-INF ...

  8. Device Tree Usage 【转】

    转自:http://blog.chinaunix.net/uid-20522771-id-3457184.html 原文链接:http://devicetree.org/Device_Tree_Usa ...

  9. c#学习笔记之Application.DoEvents应用

    Visual Studio里的摘要:处理当前在消息队列中的所有 Windows 消息. 交出CPU控制权,让系统可以处理队列中的所有Windows消息 比如在大运算量循环内,加Application. ...

  10. AC日记——货车运输 codevs

    3287 货车运输 2013年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Descri ...