Cod sursa(job #1789259)

Utilizator robx12lnLinca Robert robx12ln Data 26 octombrie 2016 20:24:44
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include<fstream>
#include<cstring>
#include<vector>
#include<deque>
#define DIM 1005
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int x, y, cant, n, m, C[DIM][DIM], F[DIM][DIM], t[DIM], viz[DIM], sol;
vector<int> v[DIM];
deque<int> d;
int bfs(){
    int ok = 0;
    memset( viz, 0, sizeof(viz) );
    viz[1] = 1;
    t[1] = 0;
    d.push_back( 1 );
    while( !d.empty() ){
        int nod = d.front();
        if( nod == n ){
            ok = 1;
        }
        for( int i = 0; i < v[nod].size(); i++ ){
            int fiu = v[nod][i];
            if( viz[fiu] == 0 && C[nod][fiu] > F[nod][fiu] ){
                d.push_back(fiu);
                viz[fiu] = 1;
                t[fiu] = nod;
            }
        }
        d.pop_front();
    }
    return ok;
}
int main(){
    fin >> n >> m;
    for( int i = 1; i <= m; i++ ){
        fin >> x >> y >> cant;
        v[x].push_back( y );
        C[x][y] = cant;
        v[y].push_back( x );
    }
    while( bfs() == 1 ){
        for( int i = 0; i < v[n].size(); i++ ){
            int nod = v[n][i];
            if( viz[nod] == 1 && C[nod][n] > F[nod][n] ){
                int minim = C[nod][n] - F[nod][n];
                for( int i = nod; t[i] != 0; i = t[i] ){
                    minim = min( minim, C[t[i]][i] - F[t[i]][i] );
                }
                F[nod][n] += minim;
                F[n][nod] -= minim;
                for( int i = nod; t[i] != 0; i = t[i] ){
                    F[t[i]][i] += minim;
                    F[i][t[i]] -= minim;
                }
                sol += minim;
            }
        }
    }
    fout << sol << "\n";
    return 0;
}