Cod sursa(job #574997)

Utilizator AndrewTheGreatAndrei Alexandrescu AndrewTheGreat Data 7 aprilie 2011 19:18:26
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <fstream>
#include <vector>
#include <queue>
#include <string.h>
#define pb push_back
#define TR(C, i)\
    for(i = C.begin(); i != C.end(); i++)

using namespace std;

int N, M;
const int nmax = 1024;
vector<int> G[nmax];
int C[nmax][nmax], E[nmax][nmax];

void read()
{
    ifstream in ("maxflow.in");
    in >> N >> M;
    int i, a, b, c;
    for(i = 1; i <= M; i++)
    {
        in >> a >> b >> c;
        G[a].pb( b );
        G[b].pb( a );
        C[a][b] += c;
    }
}

int dist[nmax];

int BFS()
{
    queue <int> Q;
    Q.push(1);
    int nod;
    memset(dist, 0, sizeof(dist));
    dist[1] = 1;
    vector<int>::iterator i;
    while(!Q.empty())
    {
        nod = Q.front();
        Q.pop();
        if(nod == N)
            break;
        TR(G[nod],i)
            if(C[nod][*i])
            {
                if(dist[*i] == 0)
                {
                    Q.push(*i);
                    dist[*i] = dist[nod] + 1;
                    E[nod][++E[nod][0]] = *i;
                }
                else if(dist[*i] == dist[nod] + 1)
                    E[nod][++E[nod][0]] = *i;
            }
    }
    return nod == N;
}

int DF(int nod, int cap)
{
    if(cap == 0)
        return cap;

    if(nod == N)
        return cap;

    int bag = 0, r, i;
    for(i = 1; i <= E[nod][0]; i++)
    {
        r = DF(E[nod][i], min( cap, C[nod][E[nod][i]] ));
        if(r)
        {
            C[nod][E[nod][i]] -= r;
            C[E[nod][i]][nod] += r;
            bag += r;
        }
    }
    return bag;
}

int main()
{
    read();
    int flow, r, i;
    for(flow = 0; BFS();)
    {
        for(i = 1; i <= E[1][0]; i++)
        {
            r = DF(E[1][i], C[1][E[1][i]]);
            C[1][E[1][i]] -= r;
            C[E[1][i]][1] += r;
            flow += r;
        }
        memset(E, 0, sizeof(E));
    }
    ofstream out("maxflow.out");
    out<< flow << '\n';

    return 0;
}