POJ 1273 Drainage Ditches(EK) - from lanshui_Yang

来源:互联网 发布:java扑克牌比大小 编辑:程序博客网 时间:2024/05/29 13:25

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


原创粉丝点击