Cod sursa(job #1219280)

Utilizator thewildnathNathan Wildenberg thewildnath Data 13 august 2014 21:47:54
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.94 kb
#include<stdio.h>
#include<vector>
#include<queue>
#include<string.h>
using namespace std;

#define NMAX 352
#define INF 2000000000

int n,m,S,D,dist;
int f[NMAX][NMAX],cost[NMAX][NMAX],cap[NMAX][NMAX],t[NMAX],val[NMAX];
bool viz[NMAX];

vector<int>v[NMAX];

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

queue<int>qt;
priority_queue<int,vector<int>, cmp>q;

void bfs()
{
    int nod,fiu;

    for(int i=1;i<=n;++i)
        val[i]=INF;
    memset(viz,false,sizeof(viz));

    viz[S]=true;
    val[S]=0;
    qt.push(S);

    while(!qt.empty())
    {
        nod=qt.front();
        qt.pop();

        if(nod==D)
            continue;

        for(int i=0;i<v[nod].size();++i)
        {
            fiu=v[nod][i];

            if(f[nod][fiu]<cap[nod][fiu] && val[fiu]>val[nod]+cost[nod][fiu])
            {
                val[fiu]=val[nod]+cost[nod][fiu];

                if(viz[fiu]==false)
                {
                    viz[fiu]=true;
                    qt.push(fiu);
                }
            }
        }
        viz[nod]=false;
    }

    dist=val[D];
}

int drum()
{
    int nod,fiu,minc=INF;

    for(int i=1;i<=n;++i)
    {
        for(int j=0;j<v[i].size();++j)
        {
            fiu=v[i][j];
            if(val[i]!=INF && val[fiu]!=INF)
                cost[i][fiu]+=val[i]-val[fiu];
        }
    }

    for(int i=1;i<=n;++i)
        val[i]=INF;

    val[S]=0;
    t[S]=S;
    viz[S]=true;
    q.push(S);

    while(!q.empty())
    {
        nod=q.top();
        q.pop();

        for(int i=0;i<v[nod].size();++i)
        {
            fiu=v[nod][i];

            if(f[nod][fiu]<cap[nod][fiu] && val[nod]+cost[nod][fiu]<val[fiu])
            {
                val[fiu]=val[nod]+cost[nod][fiu];

                t[fiu]=nod;

                if(viz[fiu]==false)
                {
                    viz[fiu]=true;
                    q.push(fiu);
                }
            }
        }
        viz[nod]=false;
    }

    if(val[D]!=INF)
    {
        for(int i=D;i!=S;i=t[i])
            if(cap[t[i]][i]-f[t[i]][i]<minc)
                minc=cap[t[i]][i]-f[t[i]][i];

        for(int i=D;i!=S;i=t[i])
        {
            f[t[i]][i]+=minc;
            f[i][t[i]]-=minc;
        }

        dist+=val[D];

        return dist*minc;
    }

    return INF;
}

int main()
{
    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);
    int i,j,x,y,c,z,d,sol=0;

    scanf("%d%d%d%d",&n,&m,&S,&D);
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d%d",&x,&y,&c,&z);
        v[x].push_back(y);
        v[y].push_back(x);

        cost[x][y]=z;
        cost[y][x]=-z;
        cap[x][y]=c;
    }

    bfs();

    while(true)
    {
        d=drum();

        if(d==INF)
            break;
        sol+=d;
    }

    printf("%d\n",sol);

    return 0;
}