Cod sursa(job #882905)

Utilizator cremarencodianaCremarenco Diana cremarencodiana Data 19 februarie 2013 15:57:15
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <stdio.h>
# include <string.h>
# include <algorithm>
using namespace std;

int n,m,c[1010][1010],f[1010][1010],r,t[1010],i,x,y,fl;
int BFS()
{
    int p,u,nod,i,q[1010];
    memset(t,0,sizeof(t));
    p=u=1;
    t[1]=-1;
    q[1]=1;
    while (p<=u)
    {
        nod=q[p];
        for (i=1; i<=n; i++)
            if (t[i]==0 && c[nod][i]>f[nod][i])
            {
                t[i]=nod;
                q[++u]=i;
                if (i==n) return 1;
            }
        p++;
    }
    return 0;
}

void flux()
{
    int i,j; int r;
    while (BFS())
    {
        for (i=1; i<=n; i++)
             {
             if (t[i]==-1 || c[i][n]<=f[i][n])
                continue;
                r=c[i][n]-f[i][n];
                for (j=i; j!=1 && j;)
                {
                    r=min(r,c[t[j]][j]-f[t[j]][j]);
                    j=t[j];
                }
                if (r==0) continue;
                f[i][n]+=r;
                f[n][i]-=r;
                for (j=i; j!=1;)
                {
                    f[t[j]][j]+=r;
                    f[j][t[j]]-=r;
                    j=t[j];
                }
                fl+=r;
             }
    }

}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d %d\n",&n,&m);
    for (i=1; i<=m; i++)
    {
        scanf("%d %d %d\n",&x,&y,&r);
        c[x][y]=r;
    }
    fl=0;
    flux();
    printf("%d\n",fl);
    return 0;
}