您的位置:首页 > 产品设计 > UI/UE

POJ 1273 Drainage Ditches(EK) - from lanshui_Yang

2013-08-29 10:27 344 查看
题目大意:每次下雨的时候,农场主John 的农场里就会形成一个池塘,这样就会淹没其中一个小块土地,在这块土地上种植了Bessie 最喜欢的植物。这意味着这些植物要被水淹没一段时间,而后要花很长时间才能重新长出来。因此,John 修建了一套排水系统,这样种植了这些植物的土地就不会被淹没。雨水被排到了附近的一条小河中。作为一个一流的工程师,John还在每条排水沟的起点安装了调节阀门,这样可以控制流入排水沟的水流的速度。

John不仅知道每条排水沟每分钟能排多少加仑的水,而且还知道整个排水系统的布局,

池塘里的水通过这个排水系统排到排水沟,并最终排到小河中,构成一个复杂的排水网络。

给定排水系统,计算池塘里能通过这个排水系统排水道小河中的最大水流速度。每条排水沟的流水方向是单方向的,但在排水系统中,流水可能构成循环。

解题思路:此题是一道基础的最大流。用EK直接水过。。。但要注意,输入中可能存在重边,要记得处理,还有,别忘了处理回流,HDU的题目数据较水(不处理回流也能过)。第一道网络流题目,纪念下。。。

请看代码:

#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#include<cstdio>
using namespace std ;
const int MAXN = 205 ;
inline void RD(int &a)
{
a = 0 ;
char t ;
do
{
t = getchar() ;
}
while (t < '0' || t > '9') ;
a = t - '0' ;
while ((t = getchar()) >= '0' && t <= '9')
{
a = a * 10 + t - '0' ;
}
}
inline void OT(int a)
{
if(a >= 10)
{
OT(a / 10) ;
}
putchar(a % 10 + '0') ;
}
struct Edge
{
int c ;
int f ;
} e[MAXN][MAXN] ;
bool vis[MAXN] ;
int pre[MAXN] ; // 记录bfs后增广路中结点的前驱结点
const int INF = 0x7fffffff ;
int m , n ;
int s , t ; // 源点、汇点
int flow ;
void init()
{
int i ;
s = 1 ;
t = n ;
flow = 0 ;
memset(e , 0 , sizeof(e)) ;
memset(vis , 0 , sizeof(vis)) ;
for(i = 0 ; i < m ; i ++)
{
int a , b , c ;
scanf("%d%d%d" , &a , &b , &c) ;
e[a][b].c += c ;  // 处理重边
e[a][b].f = 0 ;
}
}
queue<int> q ;
void bfs(int u)
{
memset(vis , 0 , sizeof(vis)) ;
memset(pre , -1 , sizeof(pre)) ;
while (!q.empty())
q.pop() ;
q.push(u) ;
vis[u] = true ;
int tmp ;
while (!q.empty())
{
tmp = q.front() ;
q.pop() ;
int i ;
for(i = 1 ; i <= n ; i ++)
{
if(!vis[i] && e[tmp][i].c - e[tmp][i].f > 0 )
{
vis[i] = true ;
pre[i] = tmp ;
if(i == t)
return ;
q.push(i) ;
}
}
}
}
void solve()
{
flow = 0 ;
while (1)
{
bfs(s) ;
if(pre[t] == -1)
break ;
int delta = INF ;
int tmp = t ;
while (pre[tmp] != -1)
{
delta = min(e[ pre[tmp] ][tmp].c - e[ pre[tmp] ][tmp].f , delta) ;
tmp = pre[tmp] ;
}
tmp = t ;
while (pre[tmp] != -1)
{
e[ pre[tmp] ][tmp].f += delta ;
e[tmp][ pre[tmp] ].f -= delta ;  // 处理回流
tmp = pre[tmp] ;
}
flow += delta ;
}
printf("%d\n" , flow) ;
}
int main()
{
while (scanf("%d%d" , &m , &n) != EOF)
{
init() ;
solve() ;
}
return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: