Cod sursa(job #318459)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 28 mai 2009 16:55:59
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <stdio.h>

using namespace std;

#define maxn 1010

long n, i, m, j, k, a, b, x, l, r, ok, nod, sol, c[maxn][maxn], up[maxn], f[maxn], coa[maxn];

long min(long a, long b)
{
    if(a>b) return b;
    return a;
}

int main()
{
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for(i=1; i<=m; i++)
    {
        scanf("%d %d %d", &a, &b, &x);
        c[a][b]=x;
    }
    ok=1;
    while(ok)
    {
        for(i=1; i<=n; i++)
        {
            f[i]=0;
            up[i]=-1;
        }
        f[1]=111100;
        coa[1]=1;
        for(l=1, r=1; l<=r; l++)
        {
            nod=coa[l];
            for(i=1; i<=n; i++)
            {
                if(f[i]==0 && c[nod][i]>0)
                {
                    f[i]=min(f[nod], c[nod][i]);
                    up[i]=nod;
                    r++;
                    coa[r]=i;
                }
            }
            if(f[n]>0) break;
        }
        nod=n;
        if(f[n]>0)
        {
            ok=1;
            sol+=f[n];
            while(up[nod]!=-1)
            {
              //  printf("%d %d ", nod, up[nod]);
                i=up[nod];
                c[nod][i]+=f[n];
                c[i][nod]-=f[n];
                nod=up[nod];
            }
          //  printf("\n");
        }        
        else ok=0;
    }
    printf("%d\n", sol);
    return 0;
}