Cod sursa(job #571892)

Utilizator PavelRazvanPavel Razvan PavelRazvan Data 4 aprilie 2011 20:57:37
Problema Flux maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.54 kb
#include<algorithm>
using namespace std;
#include<vector>
#include<queue>

#define DIM 355
#define DIMb 12345
#define pb push_back
#define mp make_pair
#define fs first
#define sc second

vector <pair <short,short> > lst[DIM];
short vol[DIM][DIM],f[DIM][DIM],n,m,t[DIM],s1,s2,poz;
int sol,d[DIM];
char buff[DIMb];

inline void pars (short &nr)
{
    bool smn=0;
    nr=0;
    while((buff[poz]<'0' || buff[poz]>'9') && buff[poz]!='-')
        if(++poz==DIMb)
            fread (buff,1,DIMb,stdin),poz=0;

    while((buff[poz]>='0' && buff[poz]<='9') || buff[poz]=='-')
    {
        if(buff[poz]=='-')
            smn=1;
        else
            nr=nr*10+buff[poz]-'0';

        if(++poz==DIMb)
            fread (buff,1,DIMb,stdin),poz=0;
    }
    if(smn==1)
        nr=-nr;
}
struct cmp
{
    bool operator() (const short &a, const short &b) const
    {
        return d[a]>d[b];
    }
}; priority_queue <short, vector <short>,cmp> h;

inline void read ()
{
    short i,nr1,nr2,nr3,nr4;

    pars(n);
    pars(m);
    pars(s1);
    pars(s2);
    for(i=1;i<=m;++i)
    {
        pars(nr1);
        pars(nr2);
        pars(nr3);
        pars(nr4);
        vol[nr1][nr2]+=nr3;
        lst[nr1].pb (mp(nr2,nr4));
        lst[nr2].pb (mp(nr1,-nr4));
    }
}
inline bool dijkstra ()
{
    short i,nr;
    bool v[DIM];
    memset (v,0,sizeof (v));
    for(i=1;i<=n;++i)
        d[i]=1<<30;

    v[s1]=1;
    d[s1]=0;
    h.push(s1);

    while(!h.empty ())
    {
        nr=h.top ();
        v[nr]=0;
        h.pop ();
        for(i=0;i<lst[nr].size ();++i)
            if(vol[nr][lst[nr][i].fs]!=f[nr][lst[nr][i].fs] && d[nr]+lst[nr][i].sc<d[lst[nr][i].fs])
            {
                d[lst[nr][i].fs]=d[nr]+lst[nr][i].sc;
                t[lst[nr][i].fs]=nr;
                if(v[lst[nr][i].fs]==0)
                {
                    h.push(lst[nr][i].fs);
                    v[lst[nr][i].fs]=1;
                }
            }
    }
    if(d[s2]==1<<30)
        return 0;
    return 1;
}

inline void solve ()
{
    short j;
    int minim;

    while(dijkstra())
    {
        minim=1<<30;
        for(j=s2;j!=s1;j=t[j])
            minim=min(minim,vol[t[j]][j]-f[t[j]][j]);

        sol+=minim*d[s2];
        for(j=s2;j!=s1;j=t[j])
        {
            f[t[j]][j]+=minim;
            f[j][t[j]]-=minim;
        }
    }
}
int main ()
{
    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);
    read ();
    solve ();
    printf("%d",sol);
    return 0;
}