Cod sursa(job #927245)

Utilizator cernat.catallinFMI Cernat Catalin Stefan cernat.catallin Data 25 martie 2013 18:07:46
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <vector>
#include <queue>
#include <climits>
using namespace std;

#define Nmax 1005
#define Mmax 5005
#define inf 20000000

vector <int> graf[Nmax];
queue <int> q;
int c[Nmax][Nmax], t[Nmax], f[Nmax][Nmax]; // capacitatea & vectorul de tati in parcurgerea bfs & fluxul dintre noduri
int n, m, flow;

void read(){
    int x, y, z;
    scanf("%i %i", &n, &m);
    for(int i = 1; i <= m; ++i){
        scanf("%i %i %i", &x, &y, &z);
        c[x][y] += z;
        graf[x].push_back(y);
        graf[y].push_back(x);
    }
    fclose(stdin);
}

int bfs(){
    int u, v;
    memset(t, -1, sizeof(t));
    q.push(1);
    while(!q.empty()){
        u = q.front();
        q.pop();
        for(int i = 0, size = graf[u].size(); i < size; ++i){
            v = graf[u][i];
            if(t[v] == -1 && c[u][v] != f[u][v] ){ // adaug nodul in coada doar daca nu a mai fost vizitat si daca poate fi updatat
                t[v] = u;
                q.push(v);
            }
        }
    }
    if(t[n] == -1) return 0;
    return 1;
}

void solve(){ // algoritmul lui Deric
    int v, r;
    while(bfs()){
        for(int i = 0, size = graf[n].size(); i < size; ++i){
            v = graf[n][i];
            if(t[v] != -1 && c[v][n] != f[v][n]){
                r = inf;
                t[n] = v;
                for(int j = n; j != 1; j = t[j]) // cauta valuare cu care pot actualiza fluxurile din drum
                    r = min(r, c[t[j]][j] - f[t[j]][j]);
                if(r > 0){
                    for(int j = n; j != 1; j = t[j]){ // actualizez fluxurile
                        f[t[j]][j] += r;
                        f[j][t[j]] -= r;
                    }
                    flow += r;
                }
            }
        }
    }
}

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

    read();
    solve();
    printf("%i\n", flow);
    fclose(stdout);

    return 0;
}