Cod sursa(job #1345741)

Utilizator somuBanil Ardej somu Data 17 februarie 2015 20:42:12
Problema Flux maxim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 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] = 1;
            t[vecin] = nod;
            q.push(vecin);
        }
    }
    
    return viz[n];
}

void rezolva(){
    
    for(f_max=0; bfs(); ){
        for(unsigned i=0; i<gf[n].size(); ++i){
            int vecin = gf[n][i];
            if (f[vecin][n] == c[vecin][n] || viz[vecin]==0) continue;
            
            t[n] = vecin;
            
            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_max += f_min;
        }
        
    }
    
    g << f_max << "\n";
    
}

int main(){
    
    citeste();
    rezolva();
    
    w.close();
    g.close();
    
    return 0;
    
}