Cod sursa(job #1467742)

Utilizator t.g.g.tt.g.g.t t.g.g.t Data 4 august 2015 18:54:58
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <stdio.h>
#include <cstring>

int c[1005][1005];

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

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

    for (int i=1; i<=m; ++i)
    {
        int x,y,z;
        scanf("%d %d %d",&x,&y,&z);

        c[x][y]=z;
    }


    int f_total=0;
    int marit=1;

    while (marit > 0)
    {
        marit=0;

        int trecut[1005];
        int parcurs[1005],l;
        int prec[1005];

        memset(trecut,0,1005);
        memset(parcurs,0,1005);
        memset(prec,0,1005);

        trecut[1] = 1;
        parcurs[1]=1;
        l=1;
        prec[1]=0;
        int i=1;
        while (i<=l)
        {
            for (int j=1; j<n; ++j)
            {
                if (c[parcurs[i]][j]>0 && trecut[j]==0)
                {
                    ++l;
                    parcurs[l]=j;
                    prec[l]=i;
                    trecut[j]=1;
                }
            }
            ++i;
        }

        for (int i=1; i<=l; ++i)
        {
            if (c[parcurs[i]][n]>0)
            {
                int minim=c[parcurs[i]][n];

                int j=i;
                while (j!=1)
                {
                    if (minim>c[parcurs[prec[j]]][parcurs[j]])
                    {
                        minim=c[parcurs[prec[j]]][parcurs[j]];
                    }
                    j=prec[j];
                }

                if (minim>0)
                {
                    j=i;
                    c[parcurs[i]][n]-=minim;
                    c[n][parcurs[i]]+=minim;
                    while (j!=1)
                    {
                        c[parcurs[prec[j]]][parcurs[j]]-=minim;
                        c[parcurs[j]][parcurs[prec[j]]]+=minim;
                        j=prec[j];
                    }
                    marit+=minim;
                }
            }
        }

        f_total+=marit;

    }

    printf("%d",f_total);

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