Cod sursa(job #858991)

Utilizator Theorytheo .c Theory Data 19 ianuarie 2013 16:40:02
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include<fstream>
#include<vector>
#include<cstring>
#include<queue>

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

#define NMAX (1<<10)
#define make_pair mp
#define pb push_back

int TT[NMAX], F[NMAX][NMAX], C[NMAX][NMAX];
int N, M, flow;

queue<int> q;

vector <int> G[NMAX];

vector<int>::iterator it;

bool viz[NMAX];

void Read() {

    fin >>N >>M;
    for(int i = 1; i <= M; ++i) {
        int x, y, cost;

        fin >>x >> y>> cost;
        C[x][y] = cost;
        G[x].pb(y);
        G[y].pb(x);
    }
}

bool BFS() {

    for(int i = 0 ;i <= N; i++) viz[i] = false;


    q.push(1);
    viz[1] = true;

    while(!q.empty()) {

        int nod = q.front();
        q.pop();

        if(nod == N) continue;

        for(it = G[nod].begin() ; it != G[nod].end(); it++) {

            if(F[nod][*it] == C[nod][*it] || viz[*it] == true) continue;

            q.push(*it);
            viz[*it] = true;
            TT[*it] = nod;
        }
    }
    return viz[N];
}

int Solve() {


    for(flow = 0; BFS() ; ){
        int fmin = 1<<30;
        for(it = G[N].begin(); it != G[N].end(); ++it) {

            if(F[*it][N] == C[*it][N] || viz[*it] == false ) continue;

            TT[N] = *it;

            for(int j = N; j != 1; j = TT[j] )
                fmin = min(fmin, C[TT[j]][j] - F[TT[j]][j]);

            if(fmin == 0) continue;

            for(int j = N ; j != 1; j = TT[j]) {

                F[TT[j]][j] += fmin;
                F[j][TT[j]] -= fmin;
            }

            flow += fmin;

        }
    }
    return flow;
}
int main() {

    Read ();

    fout << Solve ();

    return 0;
}