Cod sursa(job #975429)

Utilizator Clau2000GOREA CLAUDIU-CRISTIAN Clau2000 Data 20 iulie 2013 11:53:40
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <cstdio>
#define maxv 1001
#define min(x,y) ((x)<(y) ? (x):(y))
#define abs(x) ((x)>0 ? x: -x)
using namespace std;
int n,m,viz[maxv],q[maxv];
int c[maxv][maxv], f[maxv][maxv];

int bf()
{
    int p,u,i,x;
    q[0]=1; p=u=0; viz[1]=1;
    while (p<=u && !viz[n])
    {
        x=q[p];
        p++;
        for (i=1;i<=n;i++)
            if (!viz[i])
            {
                if(f[x][i]<c[x][i])
                {
                    viz[i]=x;
                    u++;
                    q[u]=i;
                }
                else
                if(f[i][x]>0)
                {
                    viz[i]=-x;
                    u++;
                    q[u]=i;
                }
            }
    }
    return !viz[n];
}

void flux()
{
    int i,a,b,lg,v;
    int l[maxv];
    do
    {
        for(i=1;i<=n;i++) viz[i]=0;
        if (bf()) return;
        l[0]=n;
        lg=0;
        a=b=1000000000;
        while(l[lg]!=1)
        {
            lg++;
            l[lg]=abs(viz[l[lg-1]]);
            if (viz[l[lg-1]]>0)
                a=min(a,c[l[lg]][l[lg-1]]-f[l[lg]][l[lg-1]]);
            else if (viz[l[lg-1]]<0)
                    b=min(b,f[l[lg-1]][l[lg]]);
        }
        v=min(a,b);
        for(i=lg;i>0;i--)
            if(viz[l[i-1]]>0) f[l[i]][l[i-1]]+=v;
                        else  f[l[i-1]][l[i]]-=v;
    }
    while (1);
}
void tipar()
{
    int i,j,valflux=0;
   // for(i=1;i<=n;i++)
   //     for(j=1;j<=n;j++)
   //         if (f[i][j]) printf("fluxul arcului (%d,%d)=%d\n",i,j,f[i][j]);
    for(i=1;i<=n;i++) valflux+=f[i][n];
   // printf("flux maxim=%d\n",valflux);
   printf("%d\n",valflux);
}

int main()
{
    int i,x,y,z;
    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,&z);
        c[x][y]=z;
    }
    flux();
    tipar();
    return 0;
}