Cod sursa(job #271951)

Utilizator hasegandaniHasegan Daniel hasegandani Data 6 martie 2009 10:05:57
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include<stdio.h>
#include<string.h>

#define nmax 1001

int a[nmax][nmax][2],n,gasit,coada[nmax],s[nmax],f[nmax],i_c,sf_c,min,st,fin;

int abs(int x)
{
    if (x<0)
        return -x;
    return x;
}

void refac(int nod)
{
    if (nod!=st)
        if (s[nod]>0)
            {
                if (min>a[s[nod]][nod][0] - a[s[nod]][nod][1])
                    min=a[s[nod]][nod][0] - a[s[nod]][nod][1];
                refac(s[nod]);
                a[s[nod]][nod][1]+=min;
            }
        else
            {
                if (min>a[nod][abs(s[nod])][1])
                    min=a[nod][abs(s[nod])][1];
                refac(abs(s[nod]));
                a[nod][abs(s[nod])][1]-=min;
            }
}

void drum()
{
    gasit=0;
    i_c=sf_c=1;
    coada[i_c]=st;
    for(;i_c<=sf_c && coada[sf_c]!=fin; ++i_c)
        for(int i=1;i<=n;++i)
            if (a[coada[i_c]][i][0] - a[coada[i_c]][i][1]>0  &&  s[i]==0)
                s[i]=coada[i_c] , coada[++sf_c]=i;
            else
            if (a[i][coada[i_c]][1]>0 && s[i]==0 && i!=st)
                s[i]=-coada[i_c] , coada[++sf_c]=i;
            
    if (coada[sf_c]==fin) gasit=1;
}

void rez()
{
    gasit=1;
    while (gasit)
        {
        memset(s,0,sizeof(s));
        drum();
        if (s[fin])
            {
                min=32000;
                refac(fin);
            }
        
        }
}

int main()
{
    int x,y,z,m;
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&n,&m);
    st=1;
    fin=n;
    for(int i=1;i<=m;++i)
        {
            scanf("%d%d%d",&x,&y,&z);
            a[x][y][0]=z;
        }
    rez();
    
    int sol=0;
    for(int i=1;i<=n;++i)
        sol+=a[st][i][1];
        
    printf("%d\n",sol);
        
    return 0;
}