Cod sursa(job #2153675)

Utilizator MithrilBratu Andrei Mithril Data 6 martie 2018 13:29:32
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>

using namespace std;

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

#define NMAX 1005
int c[NMAX][NMAX], f[NMAX][NMAX];
int parent[NMAX];
vector<int> graf[NMAX];
bitset<NMAX> viz;
int n,m;

bool BF()
{
    viz.reset();
    queue<int> Q;
    Q.push(1);
    for(;Q.size();Q.pop())
    {
        int nod=Q.front();
        if(nod==n) continue;

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

int main()
{
    int flow,fmin;
    fin>>n>>m;
    for(int i=0;i<m;i++)
    {
        int x,y,z;
        fin>>x>>y>>z;
        c[x][y]+=z;
        graf[x].push_back(y);
        graf[y].push_back(x);
    }

    for(flow=0; BF();)
    {
        for(auto q:graf[n])
        {
            if(f[q][n]==c[q][n]||!viz[q]) continue;

            fmin=INT_MAX;

            parent[n]=q;

            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;
    return 0;
}