Cod sursa(job #1934221)

Utilizator LaurIleIle Laurentiu Daniel LaurIle Data 21 martie 2017 11:46:36
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <iostream>
#include <fstream>
#include <queue>
#define nmax 1005
#define inf 2000000000
using namespace std;

int n, m;
vector <int> G[nmax];
vector <bool> viz(nmax);
int tata[nmax];
int f[nmax][nmax], c[nmax][nmax];

void read()
{
    ifstream f("maxflow.in");
    f >> n >> m;
    for(int i=0, x, y, cost; i<m; ++i)
    {
        f >> x >> y >> cost;
        c[x][y] = cost;
        G[x].push_back(y);
        G[y].push_back(x);

    }
    f.close();
}

int bfs()
{
    for(int i=0; i<=n; ++i)
        viz[i] = 0;
    queue <int> q;
    q.push(1);
    viz[1] = true;
    while(q.size())
    {
        int nod = q.front(); q.pop();
        for(int i=0; i<G[nod].size(); ++i)
        {
            int fiu = G[nod][i];
            if(c[nod][fiu] == f[nod][fiu] || viz[fiu])
                continue;
            viz[fiu] = true;
            q.push(fiu);
            tata[fiu] = nod;
            if(fiu == n)
                return 1;
        }
    }
    return 0;
}

void solve()
{
    int flow=0, fmin;
    for( ; bfs(); )
    {
        for(int i=0; i<G[n].size(); ++i)
        {
            int nod = G[n][i];
            if(c[nod][n] == f[nod][n] || !viz[nod])
                continue;
            tata[n] = nod;
            fmin = inf;
            for(nod = n; nod != 1; nod = tata[nod])
                fmin = min(c[tata[nod]][nod] - f[tata[nod]][nod], fmin);
            for(nod = n; nod != 1; nod = tata[nod])
            {
                f[tata[nod]][nod] += fmin;
                f[nod][tata[nod]] -= fmin;
            }
            flow += fmin;
        }
    }
    ofstream g("maxflow.out");
    g << flow << '\n';
    g.close();
}

int main()
{
    read();
    solve();
    return 0;
}