Cod sursa(job #1141466)

Utilizator RadEmanuelRad Emanuel RadEmanuel Data 12 martie 2014 21:40:25
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include<fstream>
#include<list>
#include<vector>
#include<algorithm>
#include<cstring>
#define DMAX 351
#define INF 21470000
using namespace std;

ifstream fin ("fmcm.in");
ofstream fout("fmcm.out");
list<int> lista;
list<int>::iterator it;
vector< list<int> >l(DMAX,lista);
int n,m,x,y,c,z,s,d,flxmin,flux,i;
int flx[DMAX][DMAX],cost[DMAX][DMAX],cap[DMAX][DMAX],viz[DMAX],dad[DMAX],que[DMAX],dist[DMAX];

int f()
{
    int ls=0,ld=0;
    memset(viz,0,DMAX);
    memset(dad,0,DMAX);
    memset(dist,INF,DMAX);
    que[0]=s; viz[s]=1; dist[s]=0;
    while(ls<=ld)
    {
        x=que[ls++];
        for(it=l[x].begin();it!=l[x].end();++it)
        {
            y=*it;
            if(cap[x][y]>flx[x][y] && dist[y]>dist[x]+cost[x][y])
            {
                dist[y]=dist[x]+cost[x][y];
                dad[y]=x;
                if(y==d)
                {
                    viz[d]=1;
                    continue;
                }
                if(!viz[y])
                {
                    que[++ld]=y;
                    viz[y]=1;
                }
            }
        }
        viz[x]=0;
    }
    return viz[d];
}

int main()
{
    fin>>n>>m>>s>>d;
    for(i=1;i<=m;++i)
    {
        fin>>x>>y>>c>>z;
        l[x].push_back(y);
        l[y].push_back(x);
        cap[x][y]=c;
        cost[x][y]=z;
        cost[y][x]=-z;
    }
    while(f())
    {
        flux=INF;
        for(i=d;i!=s;i=dad[i])
            flux=min(flux,cap[dad[i]][i]-flx[dad[i]][i]);
        if(flux!=INF)
        {
            for(i=d;i!=s;i=dad[i])
            {
                flx[dad[i]][i]+=flux;
                flx[i][dad[i]]-=flux;
            }
            flxmin+=flux*dist[d];
        }
    }
    fout<<flxmin;
    return 0;
}