Cod sursa(job #555445)

Utilizator miticaMitica mitica Data 15 martie 2011 15:10:17
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <cstdio>
#include <algorithm>
#include <queue>

using namespace std;

const int nmax = 1024;

int n,m,i,j,x,y,c,minim,sursa,dest,f,Ct[nmax][nmax],F[nmax][nmax],viz[nmax],T[nmax];
queue <int> Q;

bool bf()
{
    int x,i;

    fill(viz+1,viz+n+1,0);

    Q.push(sursa);
    while (!Q.empty())
    {
        x=Q.front();
        for (i=1; i<=n; i++)
            if (Ct[x][i]-F[x][i]>0 && !viz[i])
            {
                viz[i]=1;
                Q.push(i);
                T[i]=x;
            }
        Q.pop();
    }
    return viz[dest];
}

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",&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)
            {
                minim=Ct[i][n]-F[i][n];
                for (j=i; j!=1; j=T[j])
                    if (Ct[T[j]][j]-F[T[j]][j]<minim)
                        minim=Ct[T[j]][j]-F[T[j]][j];
                for (j=i; j!=1; j=T[j])
                {
                    F[T[j]][j]+=minim;
                    F[j][T[j]]-=minim;
                }
                F[i][n]+=minim;
                F[n][i]-=minim;
                f+=minim;
            }
    }
    printf("%d\n", f);

    return 0;
}