Cod sursa(job #1467766)

Utilizator t.g.g.tt.g.g.t t.g.g.t Data 4 august 2015 19:40:13
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 kb
#include <stdio.h>
#include <cstring>

int c[1005][1005];
int lm[1005][2005];
int nr[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);

        ++nr[x];
        lm[x][nr[x]]=y;
        ++nr[y];
        lm[y][nr[y]]=x;

        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*sizeof(int));

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

        for (int i=1; i<=l; ++i)
        {
            int nod=parcurs[i];
            if (c[nod][n]>0)
            {
                int minim=c[nod][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;
}