Cod sursa(job #899452)

Utilizator The_DisturbedBungiu Alexandru The_Disturbed Data 28 februarie 2013 14:35:36
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include<cstdio>
#include<cstdlib>
int m,n,i,j,t[1013],q[1013],c[1013][1013],f[1013][1013],x,y,z;
struct point
{
    int x;
    point *y;
}*g[1013];
inline void intro(int x, int y, int z)
{
    point *p=new point;
    p->x=y;
    p->y=g[x];
    g[x]=p;
    c[x][y]=z;
}
inline bool bf()
{
    int i,j,x;
    point *p;
    for(i=2;i<=n;++i)t[i]=0;
    i=j=0;
    q[0]=1;
    while(i<=j)
    {
        x=q[i];
        for(p=g[x];p!=NULL;p=p->y)
        if(c[x][p->x]>f[x][p->x] && t[p->x]==0)
        {
            q[++j]=p->x;
            t[p->x]=x;
        }
        ++i;
    }
    if(t[n]!=0)return 1;
    return 0;
}
inline void flux()
{
    point *p;
    int x,min;
    while(bf())
    {
        for(p=g[n];p!=NULL;p=p->y)
        {
            x=p->x;
            if(c[x][n]>f[x][n])
            {
                min=c[x][n]-f[x][n];
                while(x!=1 && min!=0)
                {
                    if(min>c[t[x]][x]-f[t[x]][x])min=c[t[x]][x]-f[t[x]][x];
                    x=t[x];
                }
                if(min==0)continue;
                x=p->x;
                f[x][n]+=min;
                f[n][x]-=min;
                while(x!=1)
                {
                    f[t[x]][x]+=min;
                    f[x][t[x]]-=min;
                    x=t[x];
                }
            }
        }
    }
}
int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=0;i<m;++i)
    {
        scanf("%d%d%d",&x,&y,&z);
        intro(x,y,z);
        intro(y,x,0);
    }
    t[1]=1;
    flux();
    z=0;
    for(i=1;i<=n;++i)z+=f[i][n];
    printf("%d",z);
    return 0;
}