Cod sursa(job #1513207)

Utilizator robx12lnLinca Robert robx12ln Data 29 octombrie 2015 09:16:43
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include<fstream>
#include<vector>
#include<cstring>
#include<deque>
#define DIM 1005
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int C[DIM][DIM],F[DIM][DIM],x,y,z,n,m,s[DIM],t[DIM];
vector<int> v[DIM];
deque<int> d;
int bfs(){
    int ok=0;
    memset(s,0,sizeof(s));
    d.push_back(1);
    s[1]=1;
    while( !d.empty() ){
        int nod=d[0];
        for( int i=0 ; i < v[nod].size() ; i++ ){
            int vecin = v[nod][i] ;
            if( s[vecin] == 0 && C[nod][vecin] > F[nod][vecin] ){
                d.push_back(vecin);
                s[vecin] = 1;
                t[vecin] = nod;
                if( vecin == n ) ok=1;
            }
        }
        d.pop_front();
    }

    return ok;
}
int minim,flux;
int main(){
    fin>>n>>m;
    for(int i=1;i<=m;i++){
        fin>>x>>y>>z;
        v[x].push_back(y);
        v[y].push_back(x);
        C[x][y]=z;
    }
    while( bfs()==1 ){
        for(int i=0 ; i < v[n].size() ; i++ ){
            int vecin =v[n][i];
            if( C[vecin][n] > F[vecin][n] && s[vecin] == 1 ){
                minim=C[vecin][n]-F[vecin][n];
                int p = vecin;
                while( t[p] != 0 ){
                    if( C[ t[p] ][ p ] > F[ t[p] ][ p ] && s[ t[p] ] == 1 ){
                        minim=min( minim , C[ t[p] ][ p ] - F[ t[p] ][ p ] );
                    }
                    p = t[p];
                }
                flux+=minim;
                F[vecin][n]+=minim;
                F[n][vecin]-=minim;
                p = vecin;
                while( t[p] != 0 ){
                    F[p][t[p]]-=minim;
                    F[t[p]][p]+=minim;
                    p = t[p] ;
                }
            }
        }

    }
    fout<<flux<<"\n";
    return 0;
}