Cod sursa(job #1454372)

Utilizator MaarcellKurt Godel Maarcell Data 26 iunie 2015 12:40:13
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 1010
#define INF (1<<30)
using namespace std;

int N,M,C[NMAX][NMAX],F[NMAX][NMAX],cd[NMAX],TT[NMAX]; vector<int> graf[NMAX];
bool viz[NMAX];

bool BFS(){
    int i,j,nod,V;
    cd[0]=cd[1]=1;
    memset(viz,0,sizeof(viz));

    for (i=1; i<=cd[0]; i++){
        nod=cd[i];
        if (nod==N) continue;

        for (j=0; j<graf[nod].size(); j++){
            V=graf[nod][j];
            if (C[nod][V]==F[nod][V] || viz[V]) continue;
            viz[V]=1;
            cd[++cd[0]]=V;
            TT[V]=nod;
        }
    }

    return viz[nod];
}

int main(){
    ifstream fin("maxflow.in");
    ofstream fout("maxflow.out");
    fin >> N >> M;

    int i,x,y,c,flow,fmin,nod;
    for (i=1; i<=M; i++){
        fin >> x >> y >> c;
        C[x][y]=c;
        graf[x].push_back(y);
        graf[y].push_back(x);
    }

    for (flow=0; BFS(); )
        for (i=0; i<graf[N].size(); i++){
            nod=graf[N][i];
            if (F[nod][N] == C[nod][N] || !viz[nod]) continue;

            fmin=INF;
            for (nod=N; nod!=1; nod=TT[nod])
                fmin=min(fmin,C[TT[nod]][nod]-F[TT[nod]][nod]);
            if (fmin==0) continue;

            for (nod=N; nod!=1; nod=TT[nod]){
                F[TT[nod]][nod]+=fmin;
                F[nod][TT[nod]]-=fmin;
            }

            flow+=fmin;
        }

    fout << flow << "\n";

    return 0;
}