Cod sursa(job #643750)

Utilizator vendettaSalajan Razvan vendetta Data 4 decembrie 2011 13:18:20
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
#define nmax 1010

using namespace std;

vector<int> gf[nmax];
int c[nmax][nmax], f[nmax][nmax], t[nmax];
int n,m, f_min, f_max;
bitset<nmax> viz;
queue<int> q;

ifstream w("maxflow.in");
ofstream g("maxflow.out");

void citeste(){

    w>>n>>m;

    for(int i=1; i<=m; ++i){
        int x, y, z;
        w>>x>>y>>z;
        gf[x].push_back(y);
        gf[y].push_back(x);
        c[x][y] += z;
    }

}

int minim(int x, int y){

    if (x > y) return y;
    return x;

}

int bfs(){

    for(int i=0; i<=n+1; ++i) viz[i] = 0;

    viz[1] = 1;
    q.push(1);

    for(; q.size(); q.pop()){
        int nod = q.front();
        if (nod == n) continue;
        for(unsigned i=0; i<gf[nod].size(); ++i){
            int vecin = gf[nod][i];
            if (c[nod][vecin] == f[nod][vecin] || viz[vecin]== 1) continue;
            viz[vecin] = i;
            t[vecin] = nod;
            q.push(vecin);
        }
    }

    return viz[n];
}

void scrie(int x){

    g<<x<<"\n";

}

void rezolva(){

    for(f_max=0; bfs(); ){
        for(unsigned i=0; i<gf[n].size(); ++i){
            int vecin = gf[n][i];
            if (c[vecin][n] == f[vecin][n] || viz[vecin]==0) continue;
            f_min = 0x3f3f;

            for(int i=n; i!=1; i=t[i]){
                f_min = minim(f_min, c[ t[i] ][i] - f[ t[i] ][i]);
            }
            if (f_min == 0) continue;

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

            f_max += f_min;
        }

    }

    scrie(f_max);

}

int main(){

    citeste();
    rezolva();

    w.close();
    g.close();

    return 0;

}