Cod sursa(job #1467772)

Utilizator t.g.g.tt.g.g.t t.g.g.t Data 4 august 2015 19:56:00
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.53 kb
#include <stdio.h>
#include <cstring>

int c[1005][1005];
int lm[1005][2005];
int nr[1005];

int pretendent[1005],nrp;

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));

        nrp=0;
        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;

                    if (c[nod][n]>0)
                    {
                        nrp++;
                        pretendent[nrp]=i;
                    }
                }
            }
            ++i;
        }

        for (int i=1; i<=nrp; ++i)
        {
            int nod=parcurs[pretendent[i]];

                int minim=c[nod][n];

                int j=prec[pretendent[i]];
                int nod1=parcurs[pretendent[i]];
                int nod2=parcurs[j];
                while (j!=0)
                {
                    if (minim>c[nod2][nod1])
                    {
                        minim=c[nod2][nod1];
                    }
                    j=prec[j];
                    nod1=nod2;
                    nod2=parcurs[j];
                }

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

        f_total+=marit;

    }

    printf("%d",f_total);

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