Cod sursa(job #1113623)

Utilizator oprea1si2si3Oprea Sebastian oprea1si2si3 Data 20 februarie 2014 19:30:38
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include<fstream>
#include<iostream>
#include<vector>
using namespace std;

int N,M,capacitate[1010][1010],flux[1010][1010],viz[1010],TT[1010],fluxmaxim,cd[1010];
vector <int> v[1010];

void citire() {

    ifstream in("maxflow.in");
    int x,y,z,i;
    in>>N>>M;
    for(i=1;i<=M;i++) {
        in>>x>>y>>z;
        v[x].push_back(y);
        v[y].push_back(x);
        capacitate[x][y]+=z;

    }
    in.close();

}

int BF() {

    int i,j,nod,vecin;
    cd[0]=1;
    cd[1]=1;
    for(i=1;i<=N;i++)
        viz[i]=0;
    viz[1]=1;
    for(i=1;i<=cd[0];i++) {
        nod=cd[i];
        if(nod==N)
            continue;
        for(j=0;j<v[nod].size();j++) {
            vecin=v[nod][j];
            if(capacitate[nod][vecin]== flux[nod][vecin] || viz[vecin])
                    continue;
            viz[vecin]=1;
            cd[0]++;
            cd[cd[0]]=vecin;
            TT[vecin]=nod;
        }
    }
    return viz[N];
}

void solve() {

    int i,nod,fmin;
    fluxmaxim=0;
    while(BF())
        for(i=0;i<v[N].size();i++) {
            nod=v[N][i];
            if(flux[nod][N]==capacitate[nod][N] || !viz[nod])
                continue;
            TT[N]=nod;
            fmin=11100000;
            for(nod=N;nod!=1;nod=TT[nod])
                fmin=min(fmin,capacitate[TT[nod]][nod]-flux[TT[nod]][nod]);
            if(fmin==0)
                continue;
            for(nod=N;nod!=1;nod=TT[nod]) {
                flux[TT[nod]][nod]+=fmin;
                flux[nod][TT[nod]]-=fmin;
            }
            fluxmaxim+=fmin;
        }

}

void afisare() {

    ofstream out("maxflow.out");
    out<<fluxmaxim<<'\n';
    out.close();

}

int main() {

    citire();
    solve();
    afisare();
    return 0;

}