Cod sursa(job #1386240)

Utilizator casuneanu.andreiCasuneanu Andrei Dan casuneanu.andrei Data 12 martie 2015 20:33:01
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <fstream>
#include <vector>
using namespace std;
#define IN "maxflow.in"
#define OUT "maxflow.out"
#define INF (1<<30)
#define NMAX 1008

ifstream fin(IN);
ofstream fout(OUT);

int n, m;
int c[NMAX][NMAX];//capacitate
vector <int> g[NMAX];
int f[NMAX][NMAX];
inline int minim(int x, int y){if (x < y) return x; return y;}

int mar[NMAX];//marcaj
int ant[NMAX];

int co[NMAX];
int st, sf=-1;

int start, final;

void citire();
void showtime();
int bfs();
void init();

int main(){
    citire();
    showtime();
    return 0;
}

void showtime(){
    int flux, fmin;
    int nod;
    for (flux = 0; bfs(); flux += fmin){
        fmin = INF;
        for (nod = final; nod != start; nod = ant[nod])
            fmin = minim(fmin, c[ant[nod]][nod] - f[ant[nod]][nod]);
        for (nod = final; nod != start; nod = ant[nod]){
            f[ant[nod]][nod] += fmin;
            f[nod][ant[nod]] -= fmin;
        }
    }
    fout <<flux<<'\n';
}

int bfs(){
    sf = -1; st = 0;
    co[++sf] = start;
    int v, t;
    int i, nr;
    init();
    while (st <= sf){
        v = co[st++];
        nr = g[v].size();
        for (i = 0; i < nr; ++i){
            t = g[v][i];
            if (c[v][t] == f[v][t] || mar[t])
                continue;
            mar[t] = 1;
            ant[t] = v;//anterioriul
            co[++sf] = t;
            if (t == final)
                return 1;
        }
    }
    return 0;
}

void init(){
    int i;
    for (i = 1; i <= n; ++i)
        mar[i] = 0;
}

void citire(){
    fin >>n>>m;

    start = 1; final = n;

    int i;
    int x, y, z;
    for (i = 1; i <= m; ++i){
        fin >>x>>y>>z;
        g[x].push_back(y);//g
        g[y].push_back(x);

        c[x][y] = z;
    }
}