Cod sursa(job #1484108)

Utilizator Vlad_lsc2008Lungu Vlad Vlad_lsc2008 Data 10 septembrie 2015 14:48:29
Problema Flux maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.48 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#define Nmax 355
#define pb push_back
using namespace std;

int n,m1,s,D,f,fcst;
int c[Nmax][Nmax],cst[Nmax][Nmax];
int inq[Nmax],old[Nmax],d[Nmax],reald[Nmax],p[Nmax];
queue<int> q;
vector<int> m[Nmax];
vector<int>::iterator it;
priority_queue< pair<int,int>,vector< pair<int,int> >,greater< pair<int,int> > > h;

void bellmanford()
{
    memset(old , 0x3f , sizeof(old));
    int loc;
    old[s]=0;
    inq[s]=1;
    q.push(s);
    for(;!q.empty();q.pop())
    {
        loc=q.front();
        inq[loc]=0;
        for(it=m[loc].begin();it<m[loc].end();it++)
            if(c[loc][*it])
            {
                if(old[loc]+c[loc][*it]>=old[*it]) continue;
                old[*it]=old[loc]+c[loc][*it];
                if(inq[*it]) continue;
                inq[*it]=1;
                q.push(*it);
            }
    }
}

bool dijkstra()
{
    memset(d,0x3f,sizeof(d));
    reald[s]=0;
    d[s]=0;
    h.push(make_pair(d[s],s));
    while(!h.empty())
    {
        int cost=h.top().first,nod=h.top().second;
        h.pop();
        if(d[nod]!=cost) continue;
        for(it=m[nod].begin();it<m[nod].end();it++)
            if(c[nod][*it])
            {
                int new_d = d[nod] + cst[nod][*it] + old[nod] - old[*it];
                if (new_d < d[*it])
                {
                    d[*it] = new_d;
                    reald[*it] = reald[nod] + cst[nod][*it];
                    p[*it] = nod;
                    h.push(make_pair(d[*it], *it));
                }
            }
    }
     memcpy(old, reald, sizeof(d));
    if (d[D] == 0x3f3f3f3f)
        return false;

    int Min = 0x3f3f3f3f, curCst = 0;
    for (int aux = D; aux != s; aux = p[aux])
        Min = min(Min, c[p[aux]][aux]),
        curCst += cst[p[aux]][aux];

    f += Min;
    fcst += Min * reald[D];
    for (int aux = D; aux != s; aux = p[aux])
        c[p[aux]][aux] -= Min,
        c[aux][p[aux]] += Min;

    return true;

}

int main()
{
    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);
    scanf("%d%d%d%d",&n,&m1,&s,&D);

    int n1,n2;
    for(;m1;m1--)
    {
        scanf("%d%d",&n1,&n2);
        m[n1].pb(n2); m[n2].pb(n1);
        scanf("%d%d",&c[n1][n2],&cst[n1][n2]);
        cst[n2][n1]=-cst[n1][n2];
    }
    bellmanford();
    while(dijkstra());
    printf("%d\n",fcst);
    fclose(stdin);
    fclose(stdout);
    return 0;
}