Cod sursa(job #940116)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 15 aprilie 2013 17:34:43
Problema Flux maxim de cost minim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <fstream>
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");

#define inf 1<<30
#include <queue>
#define LE 350

int i,n,m,S,D,xx,yy;
int cp,di;
queue<int> que;
bool vd[LE][LE];
int dist[LE][LE],flux[LE][LE],cap[LE][LE];
int source,fcost;
bool viz[LE],still=true;
int dp[LE],father[LE];

void blmf()
{
    while (!que.empty())
        que.pop();

    que.push(source);

    for(int i=1; i<=n; ++i)
        viz[i]=false;

    while (que.empty()==false)
    {
        int nod=que.front();
        que.pop();

        for(int i=1; i<=n; ++i)
            if (vd[nod][i]&&(viz[i]==false||dp[i]>dp[nod]+dist[nod][i]))
                if (cap[nod][i]-flux[nod][i]>0)
                {
                    viz[i]=true;
                    dp[i]=dp[nod]+dist[nod][i];
                    father[i]=nod;
                    que.push(i);
                }
    }

    still=viz[D];
}

int main()
{
    f>>n>>m>>source>>D;
    for(i=1; i<=m; ++i)
    {
        f>>xx>>yy>>cp>>di;
        dist[xx][yy]=di;
        dist[yy][xx]=-di;

        cap[xx][yy]=cp;
        vd[xx][yy]=vd[yy][xx]=true;
    }

    while (still)
    {
        still=false;
        blmf();
        int final=D;
        int fmax=inf;

        if (still==false)
            continue;

        while (final!=source)
        {
            fmax=min(fmax,cap[father[final]][final]-flux[father[final]][final]);
            final=father[final];
        }
        final=D;

        while (final!=source)
        {
            flux[father[final]][final]+=fmax;
            flux[final][father[final]]-=fmax;

            final=father[final];
        }
        fcost+=(fmax*dp[D]);
    }

    g<<fcost<<'\n';


    f.close();
    g.close();
    return 0;
}