Cod sursa(job #1932987)

Utilizator MithrilBratu Andrei Mithril Data 20 martie 2017 11:56:38
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<bits/stdc++.h>
#define NMAX 1024
#define pb push_back
#define mp make_pair
#define INF 0x3f3f3f3f
using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int c[NMAX][NMAX];
int f[NMAX][NMAX];
int parent[NMAX];
vector<int> g[NMAX];
bitset<NMAX> viz;
int n, m;

int BF()
{
    viz.reset();
    queue<int> Q;
    Q.push(1);
    viz[1] = 1;

    for (;Q.size();Q.pop()) {
        int nod = Q.front();
        if (nod == n) continue;

        for(auto q:g[nod]) {
            if(c[nod][q]==f[nod][q]||viz[q]) continue;
            viz[q]=1;
            Q.push(q);
            parent[q]=nod;
        }
    }
    return viz[n];
}

int main()
{
    int flow, fmin, x, y, z, nod;
    fin>>n>>m;

    for (int i = 1; i <= m; i++)
    {
        fin>>x>>y>>z;
        c[x][y] += z;
        g[x].pb(y);
        g[y].pb(x);
    }

    for (flow = 0; BF();) for(auto q:g[n]) {

        if(f[q][n]==c[q][n]||!viz[q]) continue;
        parent[n]=q;

        fmin=INF;
        for(q=n;q!=1;q=parent[q]) {

            fmin=min(fmin,c[parent[q]][q]-f[parent[q]][q]);
        }
        if(fmin==0) continue;

        for(q=n;q!=1;q=parent[q]) {

            f[parent[q]][q]+=fmin;
            f[q][parent[q]]-=fmin;
        }

        flow+=fmin;
    }
    fout<<flow<<'\n';

    return 0;
}