Cod sursa(job #300529)

Utilizator hasegandaniHasegan Daniel hasegandani Data 7 aprilie 2009 14:57:14
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<stdio.h>
#include<string.h>

#define Nmax 1050

int n,m,C[Nmax][Nmax],F[Nmax][Nmax],v[Nmax],t[Nmax],viz[Nmax],sol;

int BF()
{
    int st=1,dr=1,i,nod;
    memset(viz,0,Nmax);
    v[1]=1;
    for(;st<=dr;++st)
        {
            nod=v[st];
            for(int i=1;i<=n;++i)
                if (C[nod][i]-F[nod][i]>0 && !viz[i])
                    {
                        viz[i]=1;
                        v[++dr]=i;
                        t[i]=nod;
                    }
        }
    return (viz[n]);
}

void Fulkerson()
{
    int i,min;
    while(BF())
        for(int j=1;j<=n;++j)
            if(C[j][n]-F[j][n]>0)
                {
                min=C[j][n]-F[j][n];
                for(i=j;i!=1;i=t[i])
                    if(C[t[i]][i]-F[t[i]][i]<min)
                        min=C[t[i]][i]-F[t[i]][i];
                for(i=j;i!=1;i=t[i])
                    {
                    F[t[i]][i]+=min;
                    F[i][t[i]]-=min;
                    }
                F[j][n]+=min;
                F[n][j]-=min;
                sol+=min;
                }
}

int main()
{
    int i,a,b,c;
    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",&a,&b,&c);
        C[a][b]=c;
        }
    Fulkerson();
    printf("%d\n",sol);
    return 0;
}