Cod sursa(job #431652)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 1 aprilie 2010 11:31:25
Problema Flux maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 kb
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <vector>
#define IN "fmcm.in"
#define OUT "fmcm.out"
#define Lg 355
#define oo 0x3f3f3f3f

using namespace std;

int Fl[Lg][Lg];
int Cost[Lg][Lg];
vector <int > V[Lg];
int grad[Lg];
int T[Lg] , viz[Lg];
int Dist[Lg];
int D, S, n, m, Flux;

struct cmp
{
    bool operator()(const int &a,const int &b)const
    {
        return Dist[a]>Dist[b];
    }
};

priority_queue<int, vector<int>, cmp> Q;

void citire()
{
    int a,b,c,d;
    scanf ("%d %d %d %d",&n, &m, &S, &D);
    for (int i=0;i<m ;i++)
    {
        scanf ("%d %d %d %d",&a,&b,&c,&d);
        V[a].push_back(b);
        V[b].push_back(a);
        grad[a]++;
        grad[b]++;
        Cost[a][b]=d;
        Cost[b][a]=-d;
        Fl[a][b]=c;
    }
}

int dijkstra()
{
    int top;
    for (int i=0;i<=n;i++)
    {
        viz[i]=0;
        T[i]=0;
        Dist[i]=oo;
    }
    while (!Q.empty())
        Q.pop();
    Dist[S]=0;
    Q.push(S);
    while (!Q.empty())
    {
        top=Q.top();
        Q.pop();
        viz[top]=0;
        for (int i=0;i<grad[top];i++)
        {
            if (Dist[top] + Cost[top][V[top][i]]< Dist[V[top][i]])
                if (Fl[top][V[top][i]])
                {
                    Dist[V[top][i]] = Dist[top] + Cost[top][V[top][i]];
                    T[V[top][i]] = top;
                    if (!viz[V[top][i]])
                    {
                        viz[V[top][i]]=1;
                        Q.push(V[top][i]);
                    }
                }
        }
    }
    if (Dist[D]!=oo)
        return 1;
    return 0;
}

void solve()
{
    int nod,fl;
    while(dijkstra())
    {
        nod = D;
        fl = oo;
        while (nod!=S)
        {
            fl=min(fl,Fl[T[nod]][nod]);
            nod=T[nod];
        }
        nod=D;
        while (nod!=S)
        {
            Fl[T[nod]][nod]-=fl;
            Fl[nod][T[nod]]+=fl;
            nod=T[nod];
        }
        Flux+=fl*Dist[D];
    }
    printf("%d\n",Flux);
}

int main ()
{
    freopen (IN ,"r", stdin);
    freopen (OUT ,"w", stdout);
    citire();
    solve();
    return 0;
}