Cod sursa(job #420284)

Utilizator dead_knightTitei Paul Adrian dead_knight Data 18 martie 2010 18:45:40
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include<fstream>
#include<cstdio>
#include<vector>
#define pb push_back
#define MAX 352
#define INFI 1000000000
using namespace std;
struct capcost{
    int c, z;
};

int S, D, n, t[MAX], v[MAX], d[MAX], fmcm=0;
capcost c[MAX][MAX];

void citire();

int bmf()
{
    vector<int> coada;
    int st, dr, k, i;
    coada.pb(S);
    st=dr=0;
    for(i=1;i<=n;i++)
        t[i]=-1, d[i]=INFI, v[i]=0;
    v[S]=1, d[S]=0, t[S]=0;
    while(st<=dr)
    {
        k=coada[st++];
        v[k]=0;
        for(i=1;i<=n;i++)
            if(i!=k && c[k][i].c>0 && d[k]+c[k][i].z<d[i])
            {
                d[i]=d[k]+c[k][i].z;
                t[i]=k;
                if(!v[i])
                {
                    v[i]=1;
                    coada.pb(i);
                    dr++;
                }
            }
    }
    coada.clear();
    return d[D]!=INFI;
}

void flux()
{
    int cmin,k;
    while(bmf())
    {
        cmin=INFI;
        for(k=D; t[k]; k=t[k])
            if(c[t[k]][k].c<cmin)
                cmin=c[t[k]][k].c;
        for(k=D; t[k]; k=t[k])
        {
            c[t[k]][k].c-=cmin;
            c[k][t[k]].c+=cmin;
        }
        fmcm+=cmin*d[D];
    }
}

int main()
{
    freopen("fmcm.out","w",stdout);
    citire();
    flux();
    printf("%d", fmcm);
    return 0;
}

void citire()
{
    int m;
    ifstream fin("fmcm.in");
    fin>>n>>m>>S>>D;
    for(;m;m--)
    {
        int x,y,cap,z;
        fin>>x>>y>>cap>>z;
        c[x][y].c=cap;
        c[x][y].z=z;
        c[y][x].c=0;
        c[y][x].z=-z;
    }
}