Cod sursa(job #728848)

Utilizator Sm3USmeu Rares Sm3U Data 29 martie 2012 00:42:41
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.09 kb
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>

#define nMax 1010
#define infinit 99999999;

using namespace std;

int capacitate[nMax][nMax];
int flux[nMax][nMax];
int n;
vector <int> graf[nMax];
int tati[nMax];

int bsf(){
    queue <int> q;
    memset (tati, 0, sizeof (tati));
    tati[1] = 1;
    q.push(1);
    while (!q.empty()){
        int x = q.front();
        q.pop();
        for (unsigned int i = 0; i < graf[x].size(); ++ i){
            int nod = graf[x][i];
            if (tati[nod] == 0 && capacitate[x][nod] != flux[x][nod]){
                tati[nod] = x;
                if (nod != n){
                    q.push(nod);
                }
            }
        }
    }
    return tati[n];
}

void citire(){
    int m;
    scanf ("%d %d", &n, &m);
    while (m --){
        int x;
        int y;
        int c;
        scanf ("%d %d %d", &x, &y, &c);
        graf[x].push_back(y);
        graf[y].push_back(x);
        capacitate[x][y] = c;
    }
}

void rez(){
    int fluxMaxim = 0;
    while (bsf()){
        for (unsigned int i = 0; i < graf[n].size(); ++ i){
            int nod = graf[n][i];
            if (tati[nod] && capacitate[nod][n] != flux[nod][n]){
                tati[n] = nod;
                int fluxCurent = infinit;
                for (int j = n; j != 1; j = tati[j]){
                    if (fluxCurent > capacitate[tati[nod]][nod] - flux[tati[nod]][nod]){
                        fluxCurent = capacitate[tati[nod]][nod] - flux[tati[nod]][nod];
                    }
                }
                if (fluxCurent <= 0){
                    continue;
                }
                for (int j = n; j != 1; j = tati[j]){
                    flux[tati[j]][j] += fluxCurent;
                    flux[j][tati[j]] -= fluxCurent;
                }
                fluxMaxim += fluxCurent;
            }
        }
    }
    printf ("%d\n", fluxMaxim);
}

int main(){
    freopen ("maxflow.in", "r", stdin);
    freopen ("maxflow.out", "w", stdout);

    citire();
    rez();

    return 0;
}