Cod sursa(job #123864)

Utilizator M@2Te4iMatei Misarca M@2Te4i Data 17 ianuarie 2008 16:23:37
Problema Traseu Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <stdio.h>
#include <string.h>

using namespace std;

int a[61][61][2],w[65],e[3600],n,m,f,s;

void citire()
{
    freopen("traseu.in","r",stdin);
    scanf("%d%d", &n, &m);
    int x,y;
    for (int i=1; i<=m; i++)
    {
        scanf("%d%d", &x, &y);
        scanf("%d", &a[x][y][0]);
    }
    fclose(stdin);
}

void bf(int q)
{
    for (int i=1; i<=n; i++)
    {
        if (w[1]!=0)
            break;
        if (a[q][i][0]!=0 && a[q][i][1]!=a[q][i][0])
        {
            w[i]=q;
            if (w[1]==0)
                bf(i);
            else break;
        }
    }
}

void flux(int q)
{
    if (w[q]!=1)
    {
        if (f>(a[w[q]][q][0]-a[w[q]][q][1]))
            f=a[w[q]][q][0]-a[w[q]][q][1];
        flux(w[q]);
    }
    else
        if (f>(a[w[q]][q][0]-a[w[q]][q][1]))
            f=a[w[q]][q][0]-a[w[q]][q][1];
}

void marcare(int q)
{
//    e[++e[0]]=q;
    s+=a[w[q]][q][0];
    if (w[q]!=1)
    {
        a[w[q]][q][1]+=f;
        marcare(w[q]);
    }
    else
        a[w[q]][q][1]+=f;
}

void traseu()
{
    w[1]=1;
    while (w[1]!=0)
    {
        memset(w,0,sizeof(w));
        bf(1);
        if (w[1]==0)
            break;
        f=15000;
        flux(1);
        marcare(1);
    }
}

int main()
{
    citire();
    traseu();
    freopen("traseu.out","w",stdout);
    printf("%d",s);
    fclose(stdout);
    return 0;
}