Cod sursa(job #464226)

Utilizator S7012MYPetru Trimbitas S7012MY Data 19 iunie 2010 14:00:47
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
//Ford-fulkerson cu bfs

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
#define DM 5001
#define DN 1001

int capac[DN][DN],//capacitatea
    F[DN][DN],//A matrix giving a legal flow with the maximum value
    fm,//fluxul maxim
    n,m,
    f[DN];

queue <int> coada;

bool bfs() {
    int i,x;
    memset(f,-1,sizeof(f));
    f[1]=0;
    for(coada.push(1);coada.size(); ) {
        x=coada.front();
        coada.pop();
        for(i=1; i<=n; i++)
            if(f[i]==-1 && capac[x][i]>F[x][i]) {//un fel de relaxare
                f[i]=x;
                coada.push(i);
            }
    }
    return f[n]!=-1;
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    int i,x,y,c;
    scanf("%d %d",&n ,&m );
    for(i=1; i<=m; i++) {
        scanf("%d %d",&x ,&y );
        scanf("%d",&capac[x][y]);
    }
    while (bfs())
        for(x=1; x<=n; x++)
            if(capac[x][n]>F[x][n]) {
                c=capac[x][n]-F[x][n];//capacitatea reziduala de la u la v= capac[u][v] - F[u][v];
                for( y=x; f[y]; y=f[y] )
                    c=min(c,capac[f[y]][y]-F[f[y]][y]);
                fm+=c;
                F[x][n]+=c;
                F[n][x]-=c;
                for( y=x; f[y]; y=f[y] ) {//actualizare
                    F[f[y]][y]+=c;
                    F[y][f[y]]-=c;
                }
            }
    printf("%d",fm);
    return 0;
}