Cod sursa(job #1956437)

Utilizator ciprianprohozescuProhozescu Ciprian ciprianprohozescu Data 6 aprilie 2017 19:13:43
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.41 kb
#include <fstream>
#include <vector>
#define NMAX 1010
#define INF 110010

using namespace std;

FILE *fin, *fout;

int n, m, viz[NMAX], sursa, dest, ic, sc, C[NMAX], F[NMAX][NMAX], cap[NMAX][NMAX];
vector<int> A[NMAX], B[NMAX];

int main()
{
    int i, x, y, z, acum, urm, v1, v2, v, sol;
    fin = fopen("maxflow.in", "r");
    fout = fopen("maxflow.out", "w");
    fscanf(fin, "%d%d", &n, &m);
    for (i = 1; i <= m; i++)
    {
        fscanf(fin, "%d%d%d", &x, &y, &z);
        A[x].push_back(y);
        B[y].push_back(x);
        cap[x][y] = z;
    }
    for (i = 1; i <= n; i++)
    {
        if (!A[i].size())
            dest = i;
        else if (!B[i].size())
            sursa = i;
    }
    while (true)
    {
        viz[sursa] = NMAX;
        ic = sc = 0;
        C[sc] = sursa;
        while (ic <= sc && !viz[dest])
        {
            acum = C[ic++];
            for (i = 0; i < A[acum].size(); i++)
            {
                urm = A[acum][i];
                if (!viz[urm] && F[acum][urm] < cap[acum][urm])
                {
                    viz[urm] = acum;
                    C[++sc] = urm;
                }
            }
            for (i = 0; i < B[acum].size(); i++)
            {
                urm = B[acum][i];
                if (!viz[urm] && F[urm][acum] > 0)
                {
                    viz[urm] = -acum;
                    C[++sc] = acum;
                }
            }
        }
        if (!viz[dest])
            break;
        v1 = v2 = INF;
        for (i = dest; viz[i] != NMAX; )
        {
            if (viz[i] > 0)
            {
                v1 = min(v1, cap[viz[i]][i] - F[viz[i]][i]);
                i = viz[i];
            }
            else
            {
                v2 = min(v2, F[i][-viz[i]]);
                i = -viz[i];
            }
        }
        v = min(v1, v2);
        for (i = dest; viz[i] != NMAX; )
        {
            if (viz[i] > 0)
            {
                F[viz[i]][i] += v;
                i = viz[i];
            }
            else
            {
                F[i][-viz[i]] -= v;
                i = -viz[i];
            }
        }
        for (i = 1; i <= n; i++)
            viz[i] = 0;
    }
    sol = 0;
    for (i = 0; i < A[sursa].size(); i++)
        sol += F[sursa][A[sursa][i]];
    fprintf(fout, "%d\n", sol);
    fclose(fout);
    return 0;
}