Cod sursa(job #911195)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 11 martie 2013 13:44:49
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include<fstream>
#include<queue>
#define NMAX 1010
#define INF 110011

using namespace std;

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

int n, m, C[NMAX][NMAX], F[NMAX][NMAX], vz[NMAX], q[NMAX], drum[NMAX];

void Citeste()
{
    int i, x, y, cap;

    f>>n>>m;

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

        C[x][y]=cap;
    }
}

void Initializeaza()
{
    int i;
    for (i=1; i<=n; ++i) vz[i]=0;
}

void BFS()
{
    int i, p=1, u=1, x ,y ;

    q[1]=1;  vz[1]=INF;

    while (p<=u && !vz[n])
    {
        x=q[p++];

        for (i=1; i<=n; ++i)
            if (!vz[i])
            {
                y=i;
                if (C[x][y]>F[x][y])
                {
                    vz[y]=x;
                    q[++u]=y;
                }
                else
                    if (F[y][x]>0)
                    {
                        vz[y]=-x;
                        q[++u]=y;
                    }
            }
    }
}

void Ameliorare()
{
    int nod=n, nr=0, mn=INF, x, y, i;

    while (nod!=INF)
    {
        drum[++nr]=nod;
        x=vz[nod];

        if (x!=INF)
        if (x<0)
            mn=min(mn, F[-x][nod]);
        else
            mn=min(mn, C[x][nod]-F[x][nod]);

        nod=x;
    }

    for (i=1; i<nr; ++i)
    {
        x=drum[i+1];
        y=drum[i];
        if (x<0)
        {
            F[y][-x]-=mn;
            drum[i+1]*=-1;
        }
        else
            F[x][y]+=mn;
    }
}
void Solve()
{
    do
    {
        Initializeaza();
        BFS();
        if (vz[n]) Ameliorare();
    }while (vz[n]);
}

void Afis()
{
    int i, REZ=0;

    for (i=1; i<n; ++i) REZ+=F[i][n];

    g<<REZ<<"\n";
}

int main()
{
    Citeste();

    Solve();

    Afis();

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