Cod sursa(job #637808)

Utilizator blasterzMircea Dima blasterz Data 20 noiembrie 2011 16:51:49
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
#define N 1003

vector <int> a[N];
int n, m;
int cap[N][N];
bool use[N];
int t[N];
int source, sink;

int bfs () {
    memset (t, -1, sizeof (t));
    memset (use, 0, sizeof (use));
    int Q[N], p = 0, q = 0;
    Q[0] = source;
    use[source] = 1;
    while (p <= q) {
        int u = Q[p++];
        for (vector <int>::iterator i = a[u].begin (); i != a[u].end (); ++i)
            if (!use[*i] && cap[u][*i] > 0) {
                t[*i] = u;
                Q[++q] = *i;
                use[*i] = 1;
            }
    }
    if (t[sink] != -1)
        return 1;
    return 0;
}

void max_flow () {
    int flow = 0, i;
    while (bfs ()) {
        for (i = 1; i < sink; ++i)
            if (t[i] && cap[i][sink] > 0) {
                int mn = 0x3f3f3f3f, j;
                mn = min (mn, cap[i][sink]);
                for (j = i; t[j] != -1; j = t[j]) {
                    mn = min (mn, cap[t[j]][j]);
                }
                if (mn < 0) continue;
                cap[i][sink] -= mn;
                for (j = i; t[j] != -1; j = t[j])
                    cap[ t[j] ][j] -= mn,
                    cap[j][ t[j] ] += mn;
                flow += mn;
            }
    }
    printf ("%d\n", flow);
}

int main () {
    freopen ("maxflow.in", "r", stdin);
    freopen ("maxflow.out", "w", stdout);
    scanf ("%d %d\n", &n, &m);
    source = 1; sink = n;
    int p, q, c;
    while (m--) {
        scanf ("%d %d %d\n", &p, &q, &c);
        cap[p][q] += c;
        a[p].push_back (q);
        a[q].push_back (p);
    }
    max_flow ();
}