Cod sursa(job #1881785)

Utilizator DobosDobos Paul Dobos Data 16 februarie 2017 18:51:58
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>
#define NMAX 1015
#define INF (1LL<<31)-1

using namespace std;


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

vector < int > G[NMAX];
int F[NMAX][NMAX],ant[NMAX];
bool B[NMAX];

bool BFS(const int &N){
    int nod;
    memset(B,0,NMAX);
    B[1] = 1;
    queue < int > Q;
    Q.push(1);

    while(!Q.empty()){
        nod = Q.front();
        Q.pop();

        if(nod == N) continue;

        for(auto const &it : G[nod]){
            if(B[it] || !F[nod][it]) continue;

            B[it] = 1;
            Q.push(it);
            ant[it] = nod;


        }
    }

    return B[N];

}

int main()
{
    ios :: sync_with_stdio(false);
    fin.tie(NULL);

    int n,m,x,y,c;

    fin >> n >> m;

    for(int i = 1; i <= m; i++){

        fin >> x >> y >> c;
        G[x].push_back(y);
        G[y].push_back(x);
        F[x][y] = c;

    }

    int flow = 0,mflow;

    while(BFS(n)){

        for(auto const &it : G[n]){

            if(!B[it] || !F[it][n]) continue;

            ant[n] = it;
            mflow = INF;

            for(int i = n; i != 1; i = ant[i])
                mflow = min(mflow,F[ant[i]][i]);

            if(mflow == 0) continue;

            for(int i = n; i != 1; i = ant[i]){

                F[ant[i]][i] -= mflow;
                F[i][ant[i]] += mflow;

            }

            flow += mflow;
        }

    }

    fout << flow;

    return 0;
}