Cod sursa(job #2209387)

Utilizator nacrocRadu C nacroc Data 3 iunie 2018 11:14:07
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
//flux maxim
#include <iostream>
#include <fstream>
#include <queue>
#include <bitset>
#include <string.h>
#define NMAX 1024
#define inf 1 << 28

using namespace std;

int /*G[NMAX][NMAX],*/ Gr[NMAX][NMAX], p[NMAX];
int N, M;

int bfs(int src, int dest){
    bitset<NMAX> viz;
    viz.reset();
    queue<int> q;
    memset(p, 0, sizeof(p));
    q.push(src);
    viz[src] = 1;
    p[src] = -1;
    while(!q.empty()){
        int nod = q.front();
        q.pop();
        for(int j = 1; j <= M; ++j)
            if(!viz[j] && Gr[nod][j] != 0){
                q.push(j);
                viz[j] = 1;
                p[j] = nod;
            }
    }
    return viz[dest] == 1;
}

int main(){
    int x, y, c, i, maxfx = 0, fx;
    ifstream f("maxflow.in");
    ofstream g("maxflow.out");
    f >> N >> M;
    for(int i = 1; i <= M; ++i){
        f >> x >> y >> c;
       // G[x][y] = c;
        Gr[x][y] = c;
    }
    while(bfs(1, N)){
        i = N;
        fx = inf;
        while(i != 1){
            fx = min(fx, Gr[p[i]][i]);
            i = p[i];
        }

        i = N;
        while(i != 1){
            Gr[p[i]][i] -= fx;
            Gr[i][p[i]] += fx;
            i = p[i];
        }
        maxfx += fx;
    }
    g << maxfx << "\n";
    return 0;
}