Cod sursa(job #1164899)

Utilizator heracleRadu Muntean heracle Data 2 aprilie 2014 12:48:33
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <cstdio>
#include <queue>
#include <cstring>

const int Q=1001,INF=2000000000;

FILE* in;
FILE* out;

int nrnod,nrmuc;

int mat[Q][Q],f[Q][Q];

bool finish[Q];

int actnod=1;

int pred[Q],nxt[Q],nrelem=1;

bool viz[Q];

int min(int a,int b)
{
    return a<b?a:b;
}

std::queue<int> cod;

bool bfs()
{
    while(!cod.empty())
    {
        cod.pop();
    }
    memset(viz,0,sizeof viz);


    cod.push(1);
    int act;
    while(cod.front()!=nrnod && !cod.empty())
    {
        act=cod.front();
        for(int i=1; i<=nrnod; i++)
        {
            if(viz[i]==0 && mat[act][i]-f[act][i]>0)
            {
                viz[i]=1;
                cod.push(i);
                pred[i]=act;
            }
        }

        cod.pop();
    }
    if(cod.front()==nrnod)
        return 1;
    return 0;

}

void drum(int val)
{
    int x=nrnod;
    while(x!=1)
    {
        f[pred[x]][x]+=val;
        f[x][pred[x]]-=val;
        x=pred[x];
    }
}

int minim()
{
    int m=INF,x=nrnod;;

    while(x!=1)
    {
        m=min( m,(mat[pred[x]][x]-f[pred[x]][x])>0 ? (mat[pred[x]][x]-f[pred[x]][x]) : -(mat[pred[x]][x]-f[pred[x]][x]) );
        x=pred[x];
    }
    return m;
}

int main()
{
    in=fopen("maxflow.in","r");
    out=fopen("maxflow.out","w");

    fscanf(in,"%d%d",&nrnod,&nrmuc);

    int a,b,c;

    for(int i=1; i<=nrmuc; i++)
    {
        fscanf(in,"%d%d%d",&a,&b,&c);

        mat[a][b]=c;
        //mat[b][a]=-c;
    }

    viz[1]=1;
    int m;
    while(bfs())
    {
        m=minim();
        drum(m);
        actnod=1;
    }

    int rez=0;

    for(int i=1; i<nrnod; i++)
    {
        if(f[i][nrnod]!=0)
            rez+=f[i][nrnod];
    }
    fprintf(out,"%d",rez);


    fclose(in);
    fclose(out);

    return 0;
}