Cod sursa(job #610019)

Utilizator proflaurianPanaete Adrian proflaurian Data 24 august 2011 14:17:29
Problema Flux maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include<cstdio>
#include<vector>
#include<deque>
#define M 25010
#define N 351
using namespace std;
int n,m,s,d,ns,nd,cp,cs,i,k,from[M],to[M],cap[M],flow[M],q[N],way[N],price[M],PRICE,bellman(),oo=2000000000;
vector<int> v[N],P,QD,QI;
deque<int> Q;
void upd();
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",&ns,&nd,&cp,&cs);
        k++;from[k]=ns;to[k]=nd;price[k]=cs;cap[k]=cp;v[ns].push_back(k);
        k++;from[k]=nd;to[k]=ns;price[k]=-cs;cap[k]=0;v[nd].push_back(k);
    }
    for(;bellman();)upd();
    printf("%d\n",PRICE);
    return 0;
}
int bellman()
{
    P.assign(n+1,oo);P[s]=0;
    Q.resize(0);
    Q.push_back(s);q[s]=1;
    for(;Q.size();)
    {
        m=Q.front();
        for(vector<int>:: iterator it=v[m].begin();it!=v[m].end();it++)
            if(cap[*it]-flow[*it]>0)
                if(P[to[*it]]>P[m]+price[*it])
                {
                    if(!q[to[*it]]){q[to[*it]]=1;Q.push_back(to[*it]);}
                    way[to[*it]]=*it;
                    P[to[*it]]=P[m]+price[*it];
                }
        Q.pop_front();q[m]=0;
    }
    if(P[d]==oo)return 0;
    return 1;
}
void upd()
{
    int md,mi,Flow=oo;
    for(nd=d;;)
    {
        md=way[nd];ns=from[md];
        mi=md&1?md+1:md-1;
        Flow=min(Flow,cap[md]-flow[md]);
        QD.push_back(md);
        QI.push_back(mi);
        if(ns==s)break;
        nd=ns;
    }
    PRICE+=Flow*P[d];
    for(;QD.size();)
    {
        md=QD.back();QD.pop_back();flow[md]+=Flow;
    }
    for(;QI.size();)
    {
        mi=QI.back();QI.pop_back();flow[mi]+=Flow;
    }
}