Cod sursa(job #1259851)

Utilizator rebound212Mihnea Savu rebound212 Data 10 noiembrie 2014 17:33:53
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <algorithm>
#include <cstdio>
#include <cstring>
#define MP make_pair
#define PB push_back
#define W 1001
using namespace std;
int  c[W][W],f[W][W],i,n,m,t[W],q[W],p,u,nod,fluxminim,flow,x,y,cap;
inline bool BF()
{
    memset(t,0,sizeof(t));
    p=u=0;
    q[p]=1;
    while(p<=u)
    {
        nod=q[p];
        for(i=1; i<=n; i++)
        {
            if(!t[i] && c[nod][i]>f[nod][i])
            {
                t[i]=nod;
                q[++u]=i;
                if(i==n) return 1;
            }

        }
        p++;
    }
    return 0;

}
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,&cap);
        c[x][y]=cap;
    }
    flow=0;
    int l;


    while( BF())
    { for(l=1;l<=n;l++)
       {
         if(t[l] && c[l][n]>f[l][n])
       {  t[n]=l;

           fluxminim=1000000000;
        i=n;
        while(i!=1)
        {
            if (fluxminim>c[t[i]][i]-f[t[i]][i]) {fluxminim=c[t[i]][i]-f[t[i]][i];  }
            i=t[i];
        }
        if(fluxminim<0) continue;
        i=n;
        while(i!=1)
        {
            f[t[i]][i]+=fluxminim;
            f[i][t[i]]-=fluxminim;
            i=t[i];
        }
        flow+=fluxminim;
       }
       }
    }
    printf("%d\n",flow);


    return 0;
}