Cod sursa(job #2293343)

Utilizator felixiPuscasu Felix felixi Data 30 noiembrie 2018 21:36:54
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 1000;
const int DMAX = 1e6;

struct MaxFlow
{
    int cap[NMAX+2][NMAX+2], flux[NMAX+2][NMAX+2];
    int N;
    bool viz[NMAX+2];
    vector<int> adia[NMAX+2];

    MaxFlow(int n) {
        N = n;
        memset(cap, 0, sizeof(cap));
        memset(flux, 0, sizeof(flux));
        for(  int i = 0;  i <= N;   ++i )
            adia[i].clear();
    }

    void addEdge(int x, int y, int c)
    {
        cap[x][y] += c;
        adia[x].push_back(y);
        adia[y].push_back(x);
    }

    int push(int nod, int d, int f = DMAX)
    {
        viz[nod] = 1;
        if( nod == d )
            return f;
        for( int x : adia[nod] ) {
            int nf = min(f, cap[nod][x] - flux[nod][x]);
            if( !viz[x] && flux[nod][x] < cap[nod][x] && (nf = push(x, d, nf)) ) {
                flux[nod][x] += nf;
                flux[x][nod] -= nf;
                return nf;
            }
        }
        return 0;
    }

    int calcFlow(int s, int d)
    {
        memset(flux, 0, sizeof(flux));
        int debit = 0;
        while( 1 ) {
            memset(viz, 0, sizeof(viz));
            int added = push(s, d);
            if( !added )
                break;
            debit += added;
        }
        return debit;
    }
};

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

int main()
{
    int N, M;
    in >> N >> M;
    MaxFlow MF(N);
    for( int i =1;  i <= M;  ++i ) {
        int x,y,c;
        in >> x >> y >> c;
        MF.addEdge(x, y, c);
    }
    out << MF.calcFlow(1, N) << '\n';
    return 0;
}