Cod sursa(job #298648)

Utilizator mihai0110Bivol Mihai mihai0110 Data 6 aprilie 2009 11:49:36
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include<stdio.h>
#include<vector>
#define INF 20000000
#define MAXN 510

using namespace std;

int n,m,i,j,S,D,x,y,z,t,fmin;
long long sol;
vector <int> a[MAXN];
int tata[MAXN],dist[MAXN];
int f[MAXN][MAXN],c[MAXN][MAXN],cost[MAXN][MAXN];

int bf()
{
    int i,p,u,X,Y;
    int Q[MAXN*10],inq[MAXN];
    for(i=1;i<=n;i++)
    {
        dist[i]=INF;
        inq[i]=0;
        tata[i]=0;
    }
    p=u=1;
    Q[1]=S;
    dist[S]=0;
    tata[S]=S;
    inq[S]=1;
    for(;p<=u;p++)
    {
        X=Q[p];
        for(i=0;i<a[X].size();i++)
        {
            Y=a[X][i];
            if(f[X][Y] < c[X][Y] && dist[X] + cost[X][Y] < dist[Y])
            {
                dist[Y] = dist[X] + cost[X][Y];
                tata[Y]=X;
                if(!inq[Y])
                {
                    Q[++u]=Y;
                    inq[Y]=1;
                }
            }
        }
        inq[X]=0;
    }
    if(dist[D]!=INF)
        return 1;
    return 0;
}


int main(void)
{
    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);
    scanf("%d%d%d%d",&n,&m,&S,&D);
    while(m--)
    {
        scanf("%d%d%d%d",&x,&y,&z,&t);
        c[x][y]=z;
        cost[x][y]=t;
        cost[y][x]=-t;
        a[x].push_back(y);
        a[y].push_back(x);
    }
    while(bf())
    {
        fmin=INF;
        x=D;

        while(x!=S)
        {
            fmin=min(fmin, c[tata[x]][x]-f[tata[x]][x]);
            x=tata[x];
        }
        x=D;
        while(x!=S)
        {
            f[tata[x]][x]+=fmin;
            f[x][tata[x]]-=fmin;
            x=tata[x];
        }
        sol+=fmin*dist[D];
    }
    printf("%lld\n",sol);
    return 0;
}