Cod sursa(job #1383749)

Utilizator Toast97Calin Farcas Toast97 Data 10 martie 2015 16:42:36
Problema Flux maxim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.27 kb
#include <fstream>

using namespace std;

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

int cap[1005][1005], s, t, F = 0, n, m, flux[1005][1005], q[1005], tata_mare[1005];

struct nod
{
    int info;
    nod *adr;
} *v[1005];

void adauga (int x, int y)
{
    nod *c;
    c = new nod;

    c -> info = y;
    c -> adr = v[x];
    v[x] = c;
}

void citire ()
{
    f >> n >> m;

    int x, y, c;

    for (int i = 1; i <= m; i ++)
    {
        f >> x >> y >> c;

        adauga (x, y);
        adauga (y, x);
        cap[x][y] = c;
    }
}

bool bfs ()
{
    for (int i = 1; i <= n; i ++)
        cap[0][i] = 0;

    int p, u, curent, i;
    p = u = 1;
    q[u] = 1;
    cap[0][1] = 1;

    while (p <= u)
    {
        curent = q[p];

        if (curent != t)

        for (nod *c = v[curent]; c; c = c -> adr)
            {
                i = c -> info;
                if (cap[curent][i] != flux[curent][i] && !cap[0][i])
                    {
                        ++ u;
                        q[u] = i;
                        tata_mare[i] = curent;
                        cap[0][i] = 1;
                    }
            }

        ++ p;
    }

    if (cap[0][t])
        return 1;
    return 0;
}

bool mini (int a, int b)
{
    if (a < b)
        return a;
    return b;
}

int main()
{
    citire ();
    s = 1;
    t = n;

    int curent, minim, inapoi;

    while (bfs ())
        for (nod *c = v[t]; c; c = c -> adr)
    {
        curent = c -> info;

        if (flux[curent][t] != cap[curent][t] && cap[0][curent])
        {
            tata_mare[t] = curent;

            minim = (1 << 31) - 1;

            for (inapoi = t; inapoi != 1; inapoi = tata_mare[inapoi])
                minim = mini (minim, cap[tata_mare[inapoi]][inapoi] - flux[tata_mare[inapoi]][inapoi]);

            if (minim)
            {
                 for (inapoi = t; inapoi != 1; inapoi = tata_mare[inapoi])
                 {
                     flux[tata_mare[inapoi]][inapoi] += minim;
                     flux[inapoi][tata_mare[inapoi]] -= minim;
                 }

                 F += minim;
            }

        }
    }

    g << F;

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