Cod sursa(job #1083586)

Utilizator profcntvProfCNTV profcntv Data 16 ianuarie 2014 08:45:43
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
// http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=maxFlow
# include <cstdio>
# include <cstring>
# define Nmax 10003
using namespace std;

int n, m, f;
int sursa, dest;
int T[Nmax], c[Nmax], Ct[Nmax][Nmax], F[Nmax][Nmax];
bool viz[Nmax];

int bf()
{
    int p, u, x, i;
    //cautam drumul de ameliorare
    memset(viz, 0, sizeof(viz));
    p = u = 1; c[1] = sursa;
    while(p <= u)
    {
        x = c[p]; ++p;
        for(i=1; i<=n; ++i)
            if(Ct[x][i] - F[x][i] > 0 && viz[i]==0)
            {
                c[++u] = i;
                viz[i] = 1;
                  T[i] = x; //construim arborele BFS
            }
    }
    return viz[dest];
}
int main()
{
    int x, y, c, min, i, j;

    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", &x, &y, &c);
        Ct[x][y] = c;
    }
    sursa = 1; dest = n;
    while( bf() )
    {
        for(i=1; i<=n; ++i)
            if(Ct[i][n] - F[i][n]>0)
            {
                // cautam valoarea minima cu care poate fi marit fluxul
                // asociat fiecarei muchii care se afla pe drumul gasit
                min = Ct[i][n] - F[i][n];
                for(j=i; j!=1; j=T[j])
                    if(Ct[T[j]][j] - F[T[j]][j] < min)
                        min = Ct[T[j]][j] - F[T[j]][j];
                // luam fiecare muchie x -> y si marim fluxul pe aceasta muchie
                // cu valoarea min, scazand de asemena tot aceasi valoare pe muchia y -> x.
                for(j=i; j!=1; j=T[j])
                {
                    F[T[j]][j] += min;
                    F[j][T[j]] -= min;
                }
                F[i][n] += min;
                F[n][i] -= min;
                f += min;
            }
    }
    printf("%d\n", f);
    return 0;
}