Cod sursa(job #283308)

Utilizator sandyxpSanduleac Dan sandyxp Data 18 martie 2009 23:19:37
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <cstring>
#include <queue>
using namespace std;

#define NUME "maxflow"
ifstream fi(NUME".in");
ofstream fo(NUME".out");
#define MAXN 1001
#define INF 0x3f3f3f3f

int N, M, S, D;
struct list { int nod; list *r; } *L[MAXN];
int F[MAXN][MAXN], C[MAXN][MAXN];
int T[MAXN], U[MAXN];

#define avail(i, j) (C[i][j] - F[i][j])

int BF(int S, int D)
{
    int x;
    memset(U, 0, sizeof(U));
    queue<int> Q;
    Q.push(S); U[S] = 1;
    while (!Q.empty()) {
        x = Q.front(); Q.pop();
        for (list *p = L[x]; p; p = p->r) {
            if (avail(x, p->nod) > 0 && !U[p->nod]) {
                T[p->nod] = x;
                U[p->nod] = 1;
                Q.push(p->nod);
            }
        }
    }
    return U[D];
}

void push(int x, int y) {
    list *p = new list;
    *p = (list) { y, L[x] };
    L[x] = p;
}

void fluxul(int S, int D)
{
    int f, r, i;
    for (f = 0; BF(S, D); ) {
        for (list *p = L[D]; p; p = p->r) {
	    r = avail(p->nod, D);
            for (i = p->nod; i != S; i = T[i])
                r = min(r, avail(T[i], i));
            for (i = p->nod; i != S; i = T[i])
                F[ T[i] ][i] += r, F[i][ T[i] ] -= r;
            F[p->nod][D] += r, F[D][p->nod] -= r;
	    f += r;
        }
    }
    fo << f << "\n";
}

void citirea()
{
    fi >> N >> M;
    S = 1; D = N;
    while (M--) {
        int x, y, c;
        fi >> x >> y >> c;
        push(x, y);
        push(y, x);
        C[x][y] = c;
    }
}

int main()
{
    citirea();
    fluxul(S, D);
    return 0;
}