现在的位置: 首页 > 综合 > 正文

POJ 1273 Drainage Ditches(EK) – from lanshui_Yang

2019年01月08日 ⁄ 综合 ⁄ 共 1751字 ⁄ 字号 评论关闭

        题目大意:每次下雨的时候,农场主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 ;
}

抱歉!评论已关闭.