Cod sursa(job #583222)

Utilizator nandoLicker Nandor nando Data 19 aprilie 2011 00:56:07
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;

#define MAXN 1010
#define INF 0x3f3f3f3f
#define max(a, b) (((a) < (b)) ? (a) : (b))

vector <int> g[MAXN];

typedef vector <int>::iterator iter;

int cap[MAXN][MAXN], f[MAXN][MAXN], lst[MAXN * MAXN], t[MAXN], flow, n;
bitset <MAXN> viz;

fstream fin ("maxflow.in", ios::in);
fstream fout ("maxflow.out", ios::out);

bool bfs ()
{
    viz.reset ();
    lst[0] = 1;
    viz[1] = true;

    for (int i = 0, len = 1, nd; i < len; ++i) {
        if (lst[i] != n) {
            nd = lst[i];
            for (iter it = g[nd].begin (); it != g[nd].end (); ++it) {
                if (cap[nd][*it] != f[nd][*it] && !viz[*it]) {
                    viz[*it] = true;
                    t[*it] = nd;
                    lst[len++] = *it;
                }
            }
        }
    }

    return viz[n];
}

int main ()
{
    int m;
    fin >> n >> m;

    for (int i = 1, x, y, c; i <= m; ++i) {
        fin >> x >> y >> c;
        cap[x][y] += c;
        g[x].push_back (y);
        g[y].push_back (x);
    }

    while (bfs ()) {
        for (iter it = g[n].begin (); it != g[n].end (); ++it) {
            if (cap[*it][n] != f[*it][n] && viz[*it]) {
                t[n] = *it;

                int fmin = INF;

                for (int i = n; i != 1; i = t[i]) {
                    fmin = min(fmin, cap[t[i]][i] - f[t[i]][i]);
                }

                if (fmin) {
                    for (int i = n; i != 1; i = t[i]) {
                        f[t[i]][i] += fmin;
                        f[i][t[i]] -= fmin;
                    }
                    flow += fmin;
                }
            }
        }
    }

    fout << flow;

    fin.close ();
    fout.close ();
    return 0;
}