POJ 1273 Drainage Ditches

网络流-最大流入门题。

 

CODE:

 

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
using  namespace std;

const  int M =  201;
const  int INF =  0x3f3f3f3f;
int flow[M][M], cap[M][M];
int a[M], p[M];
int s, t;
int n, m;

void init()
{
    memset(p,  0sizeof(p));
    memset(cap,  0sizeof(cap));
}

int EK( int s,  int t)
{
    queue< int> q;
    memset(flow,  0sizeof(flow));
     int f =  0;
     for(;;)
    {
        memset(a,  0sizeof(a));              //a[i]保存s到每个节点i路径上的最小参量,a[t]就是整条s-t道路上的最小残量。
        a[s] = INF;
        q.push(s);
         while(!q.empty())   //BFS找增广路径
        {
             int u = q.front(); q.pop();         //记录v的父亲,并加入FIFO队列。
             for( int v =  1; v <= n; v++)  if(!a[v] && cap[u][v]>flow[u][v])
            {
                p[v] = u; q.push(v);      //记录v的父亲,并加入FIFO队列
                a[v] = min(a[u], cap[u][v]-flow[u][v]); //s-v路径上的最小残量
            }
        }
         if(a[t] ==  0break;
         for( int u = t; u != s; u = p[u])
        {
            flow[p[u]][u] += a[t];         //更新正向流量
            flow[u][p[u]] -= a[t];         //更新反向流量
        }
        f += a[t];
    }
     return f;
}

int main()
{
     while(~scanf( " %d%d ", &m, &n))
    {
        init();
         while(m--)
        {
             int u, v, w;
            scanf( " %d%d%d ", &u, &v, &w);
            cap[u][v] += w;
        }
         int ans = EK( 1, n);
        printf( " %d\n ", ans);
    }
     return  0;
}

 

你可能感兴趣的:(poj)