Cod sursa(job #570548)

Utilizator edp100Edp100 edp100 Data 3 aprilie 2011 11:24:13
Problema Flux maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<stdio.h>
#include<string.h>

#define ll long long
#define minim(a,b) (a<b ? a : b)
#define INF 2000000000
#define NMAX 405
#define MMAX 25004

int n,m,px,py,dist[NMAX],pred[NMAX];
int x[MMAX],y[MMAX],cap[MMAX],cost[MMAX];
int f[MMAX],sol;
ll rez;

int bellman(int start,int dest)
{
    int i,j;
    memset(pred,0,sizeof(pred));
    for(i=1;i<=n;i++)
        dist[i]=INF;
    dist[start]=0;
    for(i=1;i<n;i++)
        for(j=1;j<=m;j++)
            if(cap[j]>f[j] && dist[x[j]]!=INF
            && dist[x[j]]+cost[j]<dist[y[j]])
            {
                dist[y[j]]=dist[x[j]]+cost[j];
                pred[y[j]]=j;
            }
    return dist[dest]!=INF;
}

int main ()
{
    int i;
    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);
    scanf("%d%d%d%d",&n,&m,&px,&py);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d%d",&x[i],&y[i],&cap[i],&cost[i]);
        x[m+i]=y[i];
        y[m+i]=x[i];
        cap[m+i]=0;
        cost[m+i]=-cost[i];
    }
    m*=2;
    while(bellman(px,py))
    {
        sol=INF;
        for(i=py;i!=px;i=x[pred[i]])
            sol=minim(sol,cap[pred[i]]-f[pred[i]]);
        for(i=py;i!=px;i=x[pred[i]])
        {
            f[pred[i]]+=sol;
            if(pred[i]<=m)
                f[pred[i]+m]-=sol;
            else
                f[pred[i]-m]-=sol;
            rez+=cost[pred[i]]*sol;
        }
    }
    printf("%lld\n",rez);
    return 0;
}