Cod sursa(job #1232916)

Utilizator alex_bucevschiBucevschi Alexandru alex_bucevschi Data 24 septembrie 2014 11:20:12
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 kb
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#define N 355
#define oo 1000000000
using namespace std;
vector<int>v[N];
deque<int> Q;
priority_queue<pair<int,int> >q;
int n,m,s,d,CD,x,y,C[N][N],D[N][N],FL[N][N],c[N],tata[N],i,X,sol;
void bellman()
{
    Q.push_back(s);
    for(i=1;i<=n;i++)
        c[i]=oo;
    c[s]=0;
    while(Q.size())
    {
        X=Q.front();
        for(vector<int>::iterator it=v[X].begin();it!=v[X].end();it++)
        {
            if(c[*it]>c[x]+D[x][*it])
            {
                c[*it]=c[x]+D[x][*it];
                Q.push_back(*it);
            }
        }
        Q.pop_front();
    }
    for(i=1;i<=n;i++)
        for(vector<int>::iterator it=v[i].begin();it!=v[i].end();it++)
            D[i][*it]+=c[i]-c[*it];
    CD=c[d];

}
bool dijkstra()
{
    q.push(make_pair(0,s));
    for(i=1;i<=n;i++)
    {
        tata[i]=0;
        c[i]=oo;
    }
    c[s]=0;
    while(q.size())
    {
        X=q.top().second;
        q.pop();
        for(vector<int>::iterator it=v[X].begin();it!=v[X].end();it++)
        {
            if(C[X][*it]-FL[X][*it]>0)
                if(c[*it]>c[X]+D[X][*it])
                {
                    c[*it]=c[X]+D[X][*it];
                    q.push(make_pair(-c[*it],*it));
                    tata[*it]=X;
                }
        }
    }

    return tata[d]?1:0;
}
void upd()
{
    int x=tata[d],y=d,fl;
    fl=C[x][y]-FL[x][y];
    for(;y!=s;y=tata[y],x=tata[x])
        fl=min(fl,C[x][y]-FL[x][y]);
    for(x=tata[d],y=d;y!=s;y=tata[y],x=tata[x])
    {
        FL[x][y]+=fl;
        FL[y][x]-=fl;
        //sol+=fl*D[x][y];
    }
    sol+=(c[d]+CD)*fl;

}
int main()
{
    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);
    scanf("%d%d%d%d",&n,&m,&s,&d);
    for(;m;m--)
    {
        scanf("%d%d%d%d",&x,&y,&C[x][y],&D[x][y]);
        v[x].push_back(y);
        v[y].push_back(x);
        D[y][x]=-D[x][y];
    }
    bellman();
    while(dijkstra())
        upd();
    printf("%d\n",sol);
    return 0;
}