Cod sursa(job #327815)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 30 iunie 2009 12:49:38
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include <stdio.h>
#include <vector>
#include <string.h>

using namespace std;

#define maxn 353
#define maxm 12500
#define inf 2147000000
#define pb push_back

long n, i, j, k, m, s, d, a, b, ca, cs, sol, ok, l, nod, fiu, tata;
long cost;
long c[maxn][maxn], f[maxn][maxn];
vector<long> v[maxn], w[maxn];
long coa[maxn*maxm], t[maxn], fol[maxn], dist[maxn];

long bf()
{
    long sol;
    memset(t, 0, sizeof(t));
    memset(fol, 0, sizeof(fol));
    for(i=1; i<=n; i++)
    {
        dist[i]=inf;
    }
    dist[s]=0;
    l=1;
    coa[l]=s;
    fol[s]=1;
    for(i=1; i<=l; i++)
    {
        nod=coa[i];
        for(j=0; j<v[nod].size(); j++)
        {
            fiu=v[nod][j];
            cs=w[nod][j];
            if((c[nod][fiu]-f[nod][fiu]>0) && dist[nod]+cs<dist[fiu])
            {
                t[fiu]=nod;
                dist[fiu]=dist[nod]+cs;
                if(fol[fiu]==0)
                {
                    fol[fiu]=1;
                    coa[++l]=fiu;
                }
            }
        } 
        fol[nod]=0;
    }
    if(dist[d]!=inf)
    {
        sol=inf;
        nod=d;
        while(nod!=s)
        {
            tata=t[nod];
            if(sol>c[tata][nod]-f[tata][nod])
            {
                sol=c[tata][nod]-f[tata][nod];
            }
            nod=tata;
        }
        nod=d;
        while(nod!=s)
        {
            tata=t[nod];
            f[tata][nod]+=sol;
            f[nod][tata]-=sol;
            nod=tata;
        }
        ok=1;
        return sol*dist[d];
    }
    return 0;
}


int main()
{
    freopen("fmcm.in", "r", stdin);
    freopen("fmcm.out", "w", stdout);
    scanf("%d%d%d%d", &n, &m, &s, &d);
    for(i=1; i<=m; i++)
    {
        scanf("%d%d%d%d", &a, &b, &ca, &cs);
        v[a].pb(b);
        v[b].pb(a);
        c[a][b]=ca;
        c[b][a]=0;
        w[a].pb(cs);
        w[b].pb(-cs);
    }
    ok=1;
    while(ok)
    {
        ok=0;
        cost+=bf();
    }
    printf("%d\n", cost);
    return 0;
}