Cod sursa(job #1206351)

Utilizator pentrusandaPentru Sanda pentrusanda Data 9 iulie 2014 18:27:45
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <cstdio>
#include <iostream>
#include <cstring>

using namespace std;

int n,m,c[1005][1005],f[1005][1005],x,y,z,mda[1005][1005],lista[1005],trecut[1005],prec[1005],sol;

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);

    scanf("%d %d",&n,&m);

    for (int i=1;i<=m;++i)
    {
        scanf("%d %d %d",&x,&y,&z);
        c[x][y]+=z;
        ++mda[x][0]; mda[x][mda[x][0]]=y;
        ++mda[y][0]; mda[y][mda[y][0]]=x;
    }

    bool advr=1;

int z,v,minim;
    while (advr==1)
    {
        memset(trecut,0,4020);
        lista[0]=1; lista[1]=1; trecut[1]=1;
        for (int i=1;i<=lista[0];++i)
        {
            v=lista[i];
            if (v!=n)
            for (int j=1;j<=mda[v][0];++j)
            {
                z=mda[v][j];
                if (trecut[z]==0 && c[v][z]>f[v][z])
                {
                    ++lista[0]; lista[lista[0]]=z; trecut[z]=1; prec[z]=v;
                }
            }
        }



        if (trecut[n]==1)
        {
            for (int i=1;i<=mda[n][0];++i)
            {
                z=mda[n][i];
                if (trecut[z]==1 && c[z][n]>f[z][n])
                {
                    prec[n]=z;
                    minim=c[z][n]-f[z][n],v=n;

                    while (v!=1)
                    {
                        if (minim>c[prec[v]][v]-f[prec[v]][v]) minim=c[prec[v]][v]-f[prec[v]][v];
                        v=prec[v];
                    }

                    v=n;
                    while (v!=1)
                    {
                        f[prec[v]][v]+=minim;
                        f[v][prec[v]]-=minim;
                        v=prec[v];
                    }

                    sol+=minim;
                }
            }
        } else advr=0;
    }

    printf("%d",sol);

    fclose(stdin);
    fclose(stdout);
    return 0;
}