Cod sursa(job #1380086)

Utilizator CartofenAndrei Cartof Cartofen Data 6 martie 2015 21:48:59
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

#define NMax 1005
#define inf 2100000000

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

int n,m;
int C[NMax][NMax], F[NMax][NMax];

vector<int> v[NMax];
queue<int> cd;
int ant[NMax];
bool viz[NMax];

bool BFS()
{
    int i, s = 1;
    cd.push(s);

    for(i=1;i<=n;++i) ant[i] = 0, viz[i] = false;

    viz[s] = true;

    while(!cd.empty())
    {
        s = cd.front(); cd.pop();

        if(s == n) continue;

        for(i=0;i<v[s].size();++i) if(!viz[v[s][i]] && F[s][v[s][i]] < C[s][v[s][i]])
        {
            viz[v[s][i]] = true;
            ant[v[s][i]] = s;
            cd.push(v[s][i]);
        }
    }

    return viz[n];
}

int main()
{
    int i,a,b,c;

    f>>n>>m;
    for(i=1;i<=m;++i)
    {
        f>>a>>b>>c;
        v[a].push_back(b);
        v[b].push_back(a);
        C[a][b] = c;
    }

    int nod, flowmin, flow = 0;
    while(BFS()) for(i=0;i<v[n].size();++i)
    {
        flowmin = inf;
        ant[n] = v[n][i];

        nod = n;
        while(nod != 1)
        {
            flowmin = min(flowmin,C[ant[nod]][nod]-F[ant[nod]][nod]);
            nod = ant[nod];
        }

        nod = n;
        while(nod != 1)
        {
            F[ant[nod]][nod] += flowmin;
            F[nod][ant[nod]] -= flowmin;
            nod = ant[nod];
        }

        flow += flowmin;
    }

    g<<flow<<"\n";

    f.close();
    g.close();
    return 0;
}